2011-10-27 19 views
3

私のWPFアプリケーションのいくつかの機能を、主にメインウィンドウの乱雑さを減らすために、ユーザーコントロールに配置したいと考えています。WPFコマンド - ユーザーコントロールで消費する方法

現時点では、メインウィンドウに次のコマンドが定義されています。これらは

<Window.CommandBindings> 
    <CommandBinding Command="Close" Executed="CloseCommandHandler" /> 
    <CommandBinding Command="local:AppCommands.OpenAttributes" Executed="OpenAttributesHandler" CanExecute="OpenAttributesCanExecute" /> 
</Window.CommandBindings> 

は、私は私のメインウィンドウ内にネストされたユーザーコントロールからこれらの同じコマンドを消費することができる方法はあります... ToolBar項目と、メニュー項目によって消費されていますか?

答えて

3

はい、の結合を介して:それは、ユーザーコントロールの場合

<Button Command="{Binding MyCommand}" /> 

、ちょうどそれがタイプICommandの依存関係プロパティを公開します。また、MyCommandはViewModel内になければなりません。

EDIT:
はあなたのユーザーコントロール内にネストButtonを持って言う:ユーザーコントロールの背後にあるコードで

<UserControl x:Name="MyUc"> 
... 
    <Button Command={Binding NestedCommand, ElementName=MyUc} /> 
... 
</UserControl> 

、あなたは依存関係プロパティとして「NestedCommand」を公開する必要があります。

#region NestedCommand 
    public ICommand NestedCommand 
    { 
     get { return (ICommand)GetValue(NestedCommandProperty); } 
     set { SetValue(NestedCommandProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for NestedCommand. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty NestedCommandProperty = 
     DependencyProperty.Register("NestedCommand", typeof(ICommand), typeof(MyUserControlClassName), new UIPropertyMetadata(MyDefaultValue)); 
    #endregion 

"MyDefaultValue"をnullに設定し、 "MyUserControlClassName"をUserControlの名前に設定します。これを1分間Bobとします。

あなたはユーザーコントロールは、それがNestedCommandプロパティを公開することを使用します。

<Window> 
... 
<my:Bob NestedCommand="{Binding MyCommand}" /> 
... 
</Window> 

「私は」あなたのUserControlはもちろん、定義されたのxmlns名前空間です。
MyCommandは、ビューのDataContextとして配置したオブジェクトのViewModel a.k.aに定義する必要があります。
あなたがウェブ上でそれをすべてを知ることができますが、それは、INotifyPropertyChangedを実装するクラスを作成し、それにICommandを追加して、ウィンドウのコンストラクタ内に沸く:

public MyWindow() 
{ 
... 
    this.DataContext = new MyViewModel(); 
... 
} 
+0

現在MVVMを使用していません。これを実装する方法についていくつかのノート(+リンク?)を教えてください。 – Remotec

+0

申し訳ありませんが、私は私の答えを編集します。しかし、バインディングを使用するためには、ビューのDataContextを設定する必要があります。 –

+0

@RemotecUk編集した回答をご覧ください。 –

0

はい、できます。あなたはそのコマンドにあなたのユーザコントロールでコマンドバインディングを作らなければなりません。

+0

何私に非常に類似したコードを投稿されましたが、ユーザコマンド内にありますか? – Remotec

+0

はい、 'に包まれました。 – Fischermaen

関連する問題