[英]How to Check for Available Channels In A List<>
我是C ++开发人员,最近转移到了C#。 我正在使用wpf应用程序,必须动态生成按钮,标签和文本框。 除了动态生成它们之外,我还通过维护bool available属性来确保仅显示那些可用的通道。 这是代码:
XAML:
<Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}">
<Label Grid.Column="0" Content="{Binding ChannelName}" />
<TextBox Grid.Column="1" Text="{Binding VoltageText}" PreviewTextInput="VoltageBox_PreviewTextInput" />
<Button Grid.Column="1" Content="Set" CommandParameter="{Binding}" Command="{Binding VoltageCommand}" />
<Label Grid.Column="2" Content="{Binding CurrentText}" />
<ToggleButton Grid.Column="3" Content="On" Command="{Binding VoltageToggleCommand}" IsChecked="{Binding Path=IsChecked}" />
</Grid>
<Button Content="Refresh All" Grid.Column="1" Command="{Binding Path=RefreshAllButtonCommand}" Name="RefreshAllBtn" />
ViewModel:
public ObservableCollection<VoltageBoardChannel> channelList = null;
public ObservableCollection<VoltageBoardChannel> bavaria1Channels = new ObservableCollection<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true, ID = 1},
new VoltageBoardChannel { ChannelName = "VDD__IO", IsAvailable = true, ID = 2},
new VoltageBoardChannel { ChannelName = "VDD__CODEC", IsAvailable = true, ID = 3},
new VoltageBoardChannel { ChannelName = "VDD__LDO", IsAvailable = true, ID = 4},
new VoltageBoardChannel { ChannelName = "VDD__AMP", IsAvailable = true, ID = 5},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 6},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 7},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 8},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 9},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 10},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 11},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 12},
};
public VoltageViewModel()
{
channelList = new ObservableCollection<VoltageBoardChannel>();
channelList = bavaria1Channels;
}
public ObservableCollection<VoltageBoardChannel> VoltageChannelList
{
get
{
return channelList;
}
set
{
channelList = value;
OnPropertyChanged("ChannelList");
}
}
void RefreshAllClick()
{
//Here I want to check if channel are available or not. If yes then execute few statements.
}
型号类别:
private string mChannelName;
public string ChannelName
{
get
{
return mChannelName;
}
set
{
mChannelName = value;
OnPropertyChanged("ChannelName");
}
}
private bool mIsAvailable;
public bool IsAvailable
{
get
{
return mIsAvailable;
}
set
{
mIsAvailable = value;
OnPropertyChanged("IsAvailable");
}
}
double voltageText;
public double VoltageText
{
get
{
return voltageText;
}
set
{
if (value > 5.0D || value < 0.0D)
throw new InvalidOperationException();
voltageText = value;
OnPropertyChanged("VoltageText");
}
}
string currentText = "0";
public string CurrentText
{
get
{
return currentText + " V";
}
set
{
currentText = value;
OnPropertyChanged("CurrentText");
}
}
int index ;
public int ID
{
get
{
return index;
}
set
{
index = value;
OnPropertyChanged("ID");
}
}
因此,如果您在我的Bavaria1 Channel
注意到,您会发现很少有可用频道(true),而很少有错误频道。 因此,在启动时,它仅显示可用通道。 因此,使用booltovisibility类,我可以在网格中设置可见性并相应地显示现在,这是我想要实现的目标:
当我单击RefreshAll
Button时,将触发一个名为RefreshAll_Click()
的方法,我想检查if
有条件可用的通道。 如果是,则执行一些语句。 我在C ++中做到了如下:
if(m_voltageChannels[channel].available) // Here channel is 12 as you can notice in bavaria1 list
{
cmd = (0x8400 | (channel & 0xFF));
String OldValue = m_labelCurrentVoltage[channel]->getText();
//Some Code
}
我该如何实现? :)
我会使用foreach
循环或linq。 由于您是从C#开始的,因此这里是foreach方法:
void RefreshAllClick()
{
foreach (var channel in channelList)
if (channel.IsAvailable)
//some code here
}
或者,由于ObservableCollection<T>
实现了IList<T>
,因此可以像在C ++代码中一样索引到集合中:
if (channelList[channel].IsAvailable)
//some code here
如果只需要一个布尔值,并且至少有一个通道可用,则最好使用linq:
var anyChannelIsAvailable = channelList.Any(c => c.IsAvailable);
从我之前的评论(现已删除)中移出,这是一些未经请求的进一步建议:
您应删除channelList = new ObservableCollection<VoltageBoardChannel>();
,因为您要通过在下一行中重新分配引用来立即丢弃该对象( channelList = bavaria1Channels;
)。 实际上,您根本不需要bavaria1Channels
(也不需要构造函数)。 您可以使用集合初始值设定项表达式声明和初始化channelList
,如下所示:
public ObservableCollection<VoltageBoardChannel> channelList = new ObservableCollection<VoltageBoardChannel>
{
new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true, ID = 1},
new VoltageBoardChannel { ChannelName = "VDD__IO", IsAvailable = true, ID = 2},
new VoltageBoardChannel { ChannelName = "VDD__CODEC", IsAvailable = true, ID = 3},
new VoltageBoardChannel { ChannelName = "VDD__LDO", IsAvailable = true, ID = 4},
new VoltageBoardChannel { ChannelName = "VDD__AMP", IsAvailable = true, ID = 5},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 6},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 7},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 8},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 9},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 10},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 11},
new VoltageBoardChannel { ChannelName = "", IsAvailable = false, ID = 12},
};
if (bavaria1Channels.Any(c => c.IsAvailable)) //Any channel available
{
//Execute some code :)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.