0

WPF アプリケーションのユーザー コントロールにバインドされたビューモデルのコマンドに問題があります。コマンドは、ユーザーが をオンまたはオフにしたときに実行されますcheckBox。そうは言っても、コマンドは明らかに にバインドされていcheckBoxesます。

checkBoxesプログラムを実行した後、出力ウィンドウに各コマンドに対して次のエラーが表示されます (チェックされているかチェックされていない場合、実行時にコマンドが機能しないことに注意してください)。

System.Windows.Data Error: 40 : BindingExpression path error: 'MyCommand' property not found on 'object' 'ViewModel' (HashCode=3383440)'. BindingExpression:Path=MyCommand; DataItem='ViewModel' (HashCode=3383440); target element is 'CheckBox' (Name='checkBox1'); target property is 'Command' (type 'ICommand')

これは私の XAML がどのように見えるかです:

<CheckBox Content="CheckBox" Command="{Binding MyCommand}" .../>

ビュー モデルの C# コード:

private Command _myCommand;

public Command MyCommand { get { return _myCommand; } }
private void MyCommand_C()
{
    //This is an example of how my commands interact with my model
    _dataModel._groupBoxEnabled = true;
}

コンストラクター内:

_myCommand = new Command(MyCommand_C);
4

1 に答える 1

3

ビュー モデルをビューの DataContext に割り当てる必要があります。*.xaml.cs にはどのようなコードがありますか? 次のようになります。

public MyView( )
{
    this.DataContext = new ViewModel( );
}

将来的には、出力の情報によって、ビュー モデルが接続されていないことがわかります。

System.Windows.Data エラー: 40: BindingExpression パス エラー: 'オブジェクト' 'ViewModel' (HashCode=3383440)' に 'MyCommand' プロパティが見つかりません。BindingExpression:Path=MyCommand; DataItem='ViewModel' (HashCode=3383440); ターゲット要素は 'CheckBox' (Name='checkBox1') です。ターゲット プロパティは 'Command' (タイプ 'ICommand') です。

それが話しているオブジェクトは DataContext であり、「オブジェクト」タイプとして表示されている場合、「ViewModel」タイプではなく、まだ DataContext に割り当てていないことを意味します。

データの操作に関するコメントの質問に答えるには:

コマンドを使用すると、UI からロジックをさらに分離できます。これはすばらしいことです。しかし、ある時点で、ViewModel から UI に戻りたいと思うかもしれません。これを行うには、プロパティが変更されたときに UI に通知できるプロパティを使用する必要があります。したがって、コマンドでは、CheckBox の Checked プロパティがバインドされている ViewModel (IsChecked など) のプロパティを設定できます。したがって、Xaml は次のようになります。

<CheckBox Content="CheckBox" Checked="{Binding IsChecked}" Command="{Binding MyCommand}" .../>

ViewModel は次のようになります。

private Command _myCommand;
private bool _isChecked;

public Command MyCommand { get { return _myCommand; } }
public bool IsChecked
{
    /* look at the article to see how to use getters and setters */
}

private void MyCommand_C()
{
    IsChecked = !IsChecked;
    _dataModel._groupBoxEnabled = IsChecked;
}

既にビュー モデルのプロパティであるオブジェクトのプロパティをラップする場合は、単純に (私が呼ぶものを) ラッパー プロパティを使用します。

public bool IsChecked
{
    get
    {
        return _dataModel.MyCheckBox;
    }
    set
    {
        if(_dataModel != null)
        {
            _dataModel.MyCheckBox = value;
            OnPropertyChanged("IsChecked");
        }
        // Exception handling if _dataModel is null
    }
}
于 2013-09-23T20:26:04.963 に答える