0

xaml ファイルに 2 つのコンボボックスがあります。基本的に、xaml ファイルでコンボボックスをダブルクリックすると、xaml.cs ファイルにombobox_selectionchanged イベントが作成されます。私は次のようにしました:

ビュー クラス:

<ComboBox Height="23" ItemsSource="{Binding BusRateList}" SelectedItem="{Binding SelectedBusRateItem}" SelectedIndex="2"  Name="comboBox2" SelectionChanged="comboBox2_SelectionChanged" />

<ComboBox Height="23" ItemsSource="{Binding BaudRateList}" SelectedItem="{Binding SelectedBaudRateItem}" SelectedIndex="6" Name="comboBox3" SelectionChanged="comboBox3_SelectionChanged" />

View.xaml.cs ファイル:

private void comboBox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int id = Convert.ToInt32(comboBox2.SelectedIndex);            
        int speed = mI2c._busRate[id]; //mI2C is object of viewmodel class

        sendBuf[0] = Convert.ToByte((speed & 0xFF000000) >> 24);
        sendBuf[1] = Convert.ToByte((speed & 0x00FF0000) >> 16);
        sendBuf[2] = Convert.ToByte((speed & 0x0000FF00) >> 8);
        sendBuf[3] = Convert.ToByte(speed & 0x000000FF);

        cmd = (256 << 8 | 0x00);
        mCom.WriteInternalCommand(cmd, 4, ref sendBuf);

        ReadBusAndBaudRate();            
    }


private void comboBox3_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int id = Convert.ToInt32(comboBox3.SelectedIndex);            
        int speed = mI2c._baudRate[id]; //mI2C is object of viewmodel class
        sendBuf[0] = Convert.ToByte((speed & 0xFF000000) >> 24);
        sendBuf[1] = Convert.ToByte((speed & 0x00FF0000) >> 16);
        sendBuf[2] = Convert.ToByte((speed & 0x0000FF00) >> 8);
        sendBuf[3] = Convert.ToByte(speed & 0x000000FF);

        cmd = (256 << 8 | 0x00);
        mCom.WriteInternalCommand(cmd, 4, ref sendBuf);

        ReadBusAndBaudRate();
    }

public void ReadBusAndBaudRate()
    {          

        int speed = 100;

        // Some Code

        textBox1.Text = speed.ToString();

        textBox2.Text = speed.ToString();

        // Update message in Output Window as Effective Baud Rate
    }

ViewModel クラス:

public ObservableCollection<int> _busRate;
public ObservableCollection<int> BusRateList
    {
        get { return _busRate; }
        set
        {
            _busRate = value;
            NotifyPropertyChanged("BusRateList");
        }
    }

    private int _selectedBusRate;
    public int SelectedBusRateItem
    {
        get { return _selectedBusRate; }
        set
        {
            _selectedBusRate = value;
            NotifyPropertyChanged("SelectedBusRateItem");
        }
    }      

    public ObservableCollection<int> _baudRate;
    public ObservableCollection<int> BaudRateList
    {
        get { return _baudRate; }
        set
        {
            _baudRate = value;
            NotifyPropertyChanged("BusRateList");
        }
    }

    private int _selectedBaudRate;
    public int SelectedBaudRateItem
    {
        get { return _selectedBaudRate; }
        set
        {
            _selectedBaudRate = value;
            NotifyPropertyChanged("SelectedBaudRateItem");
        }
    }

ビューモデル コンストラクターの両方のコンボボックスに約 8 項目を追加しました。

上記のプロパティを使用して、viewmodel クラスでコンボボックスの選択変更イベントを実行し、.cs ファイルで実行されたすべてのステートメントを実行する必要があります。

助けてください!!!

4

3 に答える 3

3

選択変更イベントなしでUIがビューモデルを更新するようにしたい場合は、選択したアイテムに双方向バインディングを追加するだけです。これにより、操作したい値を使用してビューモデルにアクセスできます。次に例を示します。

<ComboBox Height="23" ItemsSource="{Binding BusRateList}" SelectedItem="{Binding SelectedBusRateItem,Mode=TwoWay}" SelectedIndex="2"  Name="comboBox2"  /> 

編集: 実行したいステートメントはプロパティにあるため、SetBusRate() は SelectedBusRate で呼び出されるか、Busrate が影響を受ける可能性がある場合は SelectedBaudRate で呼び出されます。

于 2012-10-09T16:18:39.320 に答える
1

ViewModel を ReadBusAndBaudRate() メソッドで更新し、SelectedItem プロパティのセットでこのメソッドを呼び出します

public int SelectedBusRateItem
    {
        get { return _selectedBusRate; }
        set
        {
            _selectedBusRate = value;
             ReadBusAndBaudRate();
            NotifyPropertyChanged("SelectedBusRateItem");
        }
    }
    private int _selectedBaudRate;
    public int SelectedBaudRateItem
    {
        get { return _selectedBaudRate; }
        set
        {
            _selectedBaudRate = value;
            ReadBusAndBaudRate();
            NotifyPropertyChanged("SelectedBaudRateItem");
        }
    }

    private int _speed;
    public int Speed
    {
        get { return _speed; }
        set
        {
            _speed = value;
            NotifyPropertyChanged("Speed");
        }
    }


    private void ReadBusAndBaudRate()
    {
        //Do some code
        Speed = 10; // will be your logical value.
        //For message notifications use MVVM frameworks such as cinch by Sacha Barber
    }
  • Binding Mode と TextBox バインディングで xaml を更新して速度を向上

  • mcom スタッフのメソッドを次のように追加します。

      public int SelectedBaudRateItem
        {
            get { return _selectedBaudRate; }
            set
            {
                _selectedBaudRate = value;                   
                WriteMcomCommand(_selectedBaudRate );
                ReadBusAndBaudRate();
                NotifyPropertyChanged("SelectedBaudRateItem");
            }
        }    
        private void WriteMcomCommand(int id)
        {
        int speed = mI2c._busRate[id]; //mI2C is object of viewmodel class
    
        sendBuf[0] = Convert.ToByte((speed & 0xFF000000) >> 24);
        sendBuf[1] = Convert.ToByte((speed & 0x00FF0000) >> 16);
        sendBuf[2] = Convert.ToByte((speed & 0x0000FF00) >> 8);
        sendBuf[3] = Convert.ToByte(speed & 0x000000FF);
    
        cmd = (256 << 8 | 0x00);
        mCom.WriteInternalCommand(cmd, 4, ref sendBuf);
        }
    
于 2012-10-09T16:28:04.597 に答える
0

トリガーとコマンドを使用します。

<ComboBox Height="23" ItemsSource="{Binding BusRateList}" SelectedItem="{Binding SelectedBusRateItem,Mode=TwoWay}" SelectedIndex="2"  Name="comboBox2"  >
  <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                    <Command:EventToCommand Command="{Binding SelectionChangedCommand}" PassEventArgsToCommand="True" />
                </i:EventTrigger>
                </i:Interaction.Triggers>
</ComboBox>

次に、ビューモデルのコマンドをメソッドにフックします。

public ICommand SelectionChangedCommand { get; set; }

SelectionChangedCommand = new RelayCommand<SelectionChangedEventArgs>((e) => MyMethod(e));

また、XAML の名前空間に以下を追加する必要があります。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

RelayCommands を使用する場合は、MVVM Lite も必要です。

于 2012-10-11T09:00:37.630 に答える