0

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

ビューモデル:

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)、ほとんどがfalseであることがわかります。したがって、起動時に利用可能なチャンネルのみが表示されます。したがって、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
    }

どうすればこれを達成できますか?:)

4

2 に答える 2

1

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

少なくとも 1 つのチャネルが利用可能な場合に true であるブール値が必要な場合は、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},     
};            
于 2012-10-17T05:23:37.837 に答える
1
if (bavaria1Channels.Any(c => c.IsAvailable)) //Any channel available
{
    //Execute some code :)
}
于 2012-10-17T05:27:18.930 に答える