2009-02-24 10 views
17

私はWPFアプリケーションでM-V-VMパターンを使用しています。 ViewModelをContentControlにバインドし、そのViewModelのビュー(UserControl)をレンダリングするためにウィンドウリソースで定義されたデータテンプレートを使用しています。データグリッドのコマンドへのバインド

ViewModelでは、私はアイテムのコレクションを持っています。私はそのコレクションをWPFツールキットに用意されているデータグリッドにバインドしています。また、ビューモデルでは、削除するアイテムIDの引数を取るRemoveItemコマンドが定義されています。

データグリッドでそのコマンドにどのようにバインドしますか?グリッドのデータコンテキストはそのようなものなので、

は機能しません - コマンドを見つけることができません。私はRelativeSourceバインディングを行う必要があると思うが、どのように見えるだろうか? Ancestor型はUserControlですか、ContentControlですか?私のViewModelはどこにDataContextとして存在しますか?

ここにいるのですか?

答えて

36

ええ、1レベル上げる必要があります。私はElementNameとの拘束を最初に試み、必要ならばRelativeSourceに頼っています。それがコントロール内の要素名とスコープに来るときXAMLコンパイラは結び目でその半ズボンを得ることができ、

<DataGrid x:Name="_grid"> 
    ... 
     <Button Command="{Binding DataContext.RemoveItem, ElementName=_grid}"/> 
    ... 
</DataGrid> 

が言ったので、あなたは RelativeSourceに頼る必要があるかもしれません:たとえば、私はこれを好みます:

<DataGrid x:Name="_grid"> 
    ... 
    <Button Command="{Binding DataContext.RemoveItem, 
        RelativeSource={RelativeSource FindAncestor, 
            AncestorType={x:Type DataGrid}} 
        }"/> 
    ... 
</DataGrid> 

データコンテキストがビューモデルになるまで検索する必要があります。あなたが望むのであれば、UserControlを検索することができます。どちらもかなり壊れやすいバインディングなので、私はElementNameの方が好きです。

+0

驚くばかりです。ありがとう、ケント! –

+1

ようこそ。これを行うもう1つの方法は、データアイテムのコレクションではなく、子ビューモデルのコレクションを公開することです。これらの子ビューモデルは、コマンドを公開するプロパティを持つことができ、これらのような脆弱なバインディングを導入することを防ぎます。 –

+0

ありがとう、それは私の問題を解決しました。 –

1

私はViewModelという名前のコントロールのdatacontextにviewmodelを定義するのが好きです。結合は、のElementName

... 
<UserControl.DataContext> 
    <local:UserControlViewModel x:Name="ViewModel"/> 
</UserControl.DataContext> 
... 

... 
<DataGridTemplateColumn Width="30"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Command="{Binding RemoveCommand, ElementName=ViewModel}" 
        CommandParameter="{Binding}">Remove</Button> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
... 

に、この場合にコマンドパラメータは、行の全データ・オブジェクトであることに注意を使用して書くことが容易です。場合によってはデータを再度検索する必要がないため、

CommandParameter="{Binding Id}" 

よりも優れています。

関連する問題