【问题标题】:How to Check for Available Channels In A List<>如何检查列表中的可用频道<>
【发布时间】:2012-10-17 04:48:14
【问题描述】:

我是一名 C++ 开发人员,最近转向 C#。我正在开发一个 wpf 应用程序,我必须在其中动态生成按钮、标签和文本框。除了动态生成它们外,我还确保只显示那些通过维护 bool 可用属性而可用的通道。代码如下:

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" />

视图模型:

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 中注意到,您会发现可用的频道很少(真),而假的也很少。因此在启动时它只显示可用的频道。因此,使用 booltovisibility 类,我可以在我的网格中设置可见性并相应地显示现在这是我想要实现的目标:

当我单击RefreshAll 按钮时,会触发一个名为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
    }

我怎样才能做到这一点? :)

【问题讨论】:

  • 你想看看有没有可用的频道?
  • @CuongLe:我想检查是否有可用的频道。如果是,则执行一些语句:)

标签: c# .net wpf button


【解决方案1】:

我会使用 foreach 循环或 linq。由于您是从 C# 开始的,因此这里是 foreach 方法:

void RefreshAllClick() 
{
    foreach (var channel in channelList)
        if (channel.IsAvailable)
            //some code here 
} 

或者,由于 ObservableCollection&lt;T&gt; 实现了 IList&lt;T&gt;,您可以像在 C++ 代码中那样对集合进行索引:

if (channelList[channel].IsAvailable)
    //some code here

如果您只需要一个当至少有一个通道可用时为真的布尔值,则最好使用 linq:

var anyChannelIsAvailable = channelList.Any(c => c.IsAvailable);

从我之前(现已删除)的评论中移出,这里有一些不请自来的进一步建议:

您应该删除channelList = new ObservableCollection&lt;VoltageBoardChannel&gt;(); 行,因为通过在下一行(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},     
};            

【讨论】:

  • 感谢您的详细解释:)
【解决方案2】:
if (bavaria1Channels.Any(c => c.IsAvailable)) //Any channel available
{
    //Execute some code :)
}

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多