3

MVVMで使用されているコマンドバインディングを完全に失いました。オブジェクトをウィンドウにバインドしたり、そのコマンドをコントロールにバインドして、メソッドを取得するにはどうすればよいButton Clickですか?

これがCustomerViewModelクラスです:

public class CustomerViewModel : ViewModelBase
{
    RelayCommand _saveCommand;
    public ICommand SaveCommand
    {
        get
        {
            if (_saveCommand == null)
            {
                _saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave);
                NotifyPropertyChanged("SaveCommand");
            }
            return _saveCommand;
        }
    }

    public void Save()
    {
        ...
    }

    public bool CanSave { get { return true; } }

    ...

ViewModelBaseINotifyPropertyChangedインターフェイスを実装しますButton。コマンドにバインドする方法は次のとおりです。

<Button Content="Save" Margin="3" Command="{Binding DataContext.Save}" />

のインスタンスは、を含むウィンドウのにCustomerViewModel割り当てられます。DataContextButton

与えられた例は機能していません:メソッドにブレークポイントを入れましたSaveが、実行がメソッドに渡されません。私は(スタックオーバーフローでも)多くの例を見てきましたが、バインディングをどのように指定すべきか理解できません。

アドバイスしてください、どんな助けでもありがたいです。

ありがとう。

PSおそらく私RelativeSourceはボタンバインディングで指定する必要があります...このようなもの:

 Command="{Binding Path=DataContext.Save, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"

しかし、どのタイプを祖先に指定する必要がありますか?

4

1 に答える 1

10

あなたがしようとしているのは、Saveメソッドに直接バインドすることです。これはそれを行う方法ではありません。

ビューのDataContextをCustomerViewModelのインスタンスに設定したとすると、次のようにSaveCommandにバインドします。

<Button Content="Save" Margin="3" Command="{Binding SaveCommand}" />

を呼び出す必要はありませんNotifyPropertyChanged("SaveCommand");

于 2010-01-19T15:27:13.820 に答える