0

私のプログラムでは、いくつかのコントロールのプロパティを切り替えるユーザー コントロールのコマンドを記述しようとしていisEnabledますisChecked。ユーザー コントロールに接続されているのは、ビュー モデルとデータ モデルです。コマンドとプロパティはデータ モデルにあり (まず、これは正しい実装ですか?)、ビュー モデル内にデータ モデルのプロパティがあります。

コマンドが機能していません。バインディング エラーは発生しません。コードをデバッグすると、値が正しく変更されます。ただし、視覚的なフィードバックはありません。

私のビューモデルは、DataContextコンストラクターのユーザーコントロールとして設定されています。

私のデータは次のようにバインドされています。

<CheckBox Command="{Binding Model.myCommand}" ... />

これは、私のコマンドの1つがどのように見えるかの例です:

public Command myCommand { get { return _myCommand; } }
private void MyCommand_C()
{
       if (_myCommand== true) //Checked
       {
           _checkBoxEnabled = true;
       }
       else //UnChecked
       {
           _checkBoxEnabled = false;
           _checkBox = false;
       }
}

これらのコマンドが機能しないのはなぜですか?

4

2 に答える 2

1

Commandsで実装する必要がありますViewModel

IsCheckedそこまたはモデル内で、プロパティをコントロールのおよびプロパティにバインドする必要があります。コマンドでは、プロパティを変更すると、ビューを更新するイベントIsEnabledがトリガーされます。PropertyChanged

例:

あなたの見解では:

    <StackPanel>
        <Button Command="{Binding ToggleCommand}"/>
        <CheckBox IsChecked="{Binding Path=Model.IsChecked}"/>
        <CheckBox IsEnabled="{Binding Path=Model.IsEnabled}"/>
    </StackPanel>

ビューモデル:

public class MainWindowViewModel : NotificationObject
{
    public MainWindowViewModel()
    {
        Model = new MyModel();

        ToggleCommand = new DelegateCommand(() =>
            {
                Model.IsChecked = !Model.IsChecked;
                Model.IsEnabled = !Model.IsEnabled;
            });
    }

    public DelegateCommand ToggleCommand { get; set; }

    public MyModel Model { get; set; }
}

モデル:

public class MyModel : INotifyPropertyChanged
{
    private bool _isChecked;
    private bool _isEnabled;

    public bool IsChecked
    {
        get
        {
            return _isChecked;
        }
        set
        {
            _isChecked = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }

    public bool IsEnabled
    {
        get
        {
            return _isEnabled;
        }
        set
        {
            _isEnabled = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

お役に立てれば

于 2013-09-24T14:23:44.190 に答える