0

基本ビューモデルとそこから派生したビューモデルが 2 つあります。私のベースviewModelには、CloseCommand、CancelCommandなどのコマンドがあります。

私のビューは、派生ビューモデルの 1 つにアタッチされています。基本ビューモデルの CloseCommand にボタンをバインドする必要があります。継承でこれを行うにはどうすればよいですか?

ボタンのコンテンツをベースviewModelの文字列プロパティにバインドし、正常に動作していますが、コマンドをバインドするにはどうすればよいですか?

4

2 に答える 2

2

ViewModel のパブリック プロパティとして公開されている限り、これらのコマンドをバインドするために必要な特別なことはありません。私は同じ状況にあったので、これが私がそれをどのように行ったかの私自身の実装です。

まず、基本クラスで ICommand タイプの OKCommand / CancelCommand を定義します。Execute および CanExecute メソッドに関する限り、私はそれらを保護された仮想メソッドとして定義しています (ちなみに、コマンドを仮想として定義することもできます。これにより、ボタンの可視性モードを折りたたみに設定する XAML スタイルを記述できるようになります。コマンド値は null です)。派生したViewModel内では、必要に応じてコマンド、ExecuteおよびCanExecuteメソッドをオーバーライドするだけですが、ビューからは常にコマンド名に直接バインドするだけです。

以下は、私が今あなたに説明したことの例です。

public abstract class ViewModelbase
{
    private DelegateCommand _okCommand;
    public virtual DelegateCommand OkCommand
    {
        get { return _okCommand ?? (_okCommand = new DelegateCommand(OkExecuteCommand, CanOkExecute)); }
    }

    protected virtual void OkExecuteCommand()
    {
        DialogResult = true;
    }

    protected virtual bool CanOkExecute()
    {
        return IsValid;
    }
}

次に、基本ViewModelクラスから派生した具体的なViewModelクラスを定義するだけです

public class SampleViewModel : ViewModelbase
{
   //If u have defined XAML style which sets viability of button as collapsed if its command value is null u simply override command
   public override DelegateCommand OkCommand { get { return null; } }
    protected override void OkExecuteCommand()
    {
        do whatever u want as this is a command execution
    }
}

XAML の部分では、基本クラスがない場合と同様に、ボタン コマンドを Viewmodel コマンドにバインドするだけで特別なことをする必要はありません。 ここでの重要な点は、基本 ViewModel クラスから public 修飾子を使用してコマンドを公開する必要があることです (必要なのは getter だけなので、このコードはコマンドを公開できる 1 つの方法のサンプルを提供します)。

于 2012-10-12T01:51:37.840 に答える
1

Nothing special, here's what you need to do:

  1. Set the DataContext of your View to your derived ViewModel
  2. Ensure that the CloseCommand, for example, is declared as a public property in your ViewModelBase
  3. Set the Button's Command property to "{Binding CloseCommand}"
于 2012-10-12T04:36:52.840 に答える