2011-01-25 2 views
13

私のXAMLファイルには、コンテキストメニューを持つDataGridがあります。データソースは、DataGridのItemsSourceとしてプロパティEntityCollection(ObservableCollection)を持ち、DataGridにコンテキストメニューを作成するためのデータソースとして機能する別のコレクションContextMenu.MenuItemsを持つViewModelです。そのコレクションの要素は、私は、メニュー項目のCommandプロパティにバインドCommand性質を持っている:コンテキストメニューコマンドパラメータをデータグリッドプロパティにバインド

<DataGrid Name="EntityDataGrid" ItemsSource="{Binding EntityCollection}" Height="450"> 
    <DataGrid.ContextMenu> 
    <ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}"> 
     <ContextMenu.ItemContainerStyle> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
      <Setter Property="CommandParameter" 
        Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" /> 
     </Style> 
     </ContextMenu.ItemContainerStyle> 
    </ContextMenu> 
    </DataGrid.ContextMenu> 
</DataGrid> 

メニュー項目コマンドのアクションはViewModelにに次のシグネチャがあります。

private void SelectedItemsAction(object parameter) 
{ 
    // Do something with "parameter" 
} 

今私の問題は、parameternullの場合、コンテキストメニュー項目をクリックするとSelectedItemsActionに届くということです。私は自分の問題がCommandParameterプロパティの設定者にあると信じています。あなたが見ることができるように、私はに値を設定することで、データグリッドのSelectedItemsプロパティにこのプロパティをバインドしたい:

<Setter Property="CommandParameter" 
     Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" /> 

私はテストとして単純な値を試してみた:ここ

<Setter Property="CommandParameter" 
     Value="{Binding ElementName=EntityDataGrid, Path=Height}" /> 

parameterをまだnullです。そして、ちょうど任意のパラメータがすべてで私のアクションメソッドに到達したかどうかをテストするために:

<Setter Property="CommandParameter" 
     Value="10" /> 

これは動作しますが、私のアクションメソッド内parameterは確かに今10です。

CommandParameterの値をEntityDataGridのプロパティにバインドするのは間違っていますか?まったく可能ですか?

ありがとうございました!

答えて

7

祖先結合を試みましたか?ような何か:あなたはDataGridを参照するためのElementNameなどを使用することはできません理由ですので

<Setter Property="CommandParameter" 
     Value="{Binding Path=SelectedItems, 
     RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
+0

ありがとう、ありがとう、この作品! (今では、コードが正確に何をしているかを理解するために、WPFバインディングについて少しだけ読む必要があります)) – Slauma

+0

ツリーを歩いて、そのタイプに一致するアイテムを見つけようとしています。最初のものは、それをバインディング・コンテキストとして使用します。 – CodeWarrior

+0

それまでのところ、私はバインディングについて詳しく読んだことがあります。なぜ、私の元のマークアップがうまくいかなかったのか、あなたのコードが正しい方法であるのは明らかです。説明をありがとう! – Slauma

11

ContextMenuは、ビジュアルツリーの同じ部分ではありません。代わりにContextMenuPlacementTargetを使用する必要があります。このように試してください

<ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
      <Setter Property="CommandParameter" 
        Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, 
            Path=PlacementTarget.SelectedItems}" /> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 
+0

ありがとう、これもあります! (私はOffApps Coryの解答を受け入れられた回答とマークしました。数時間前に答えるだけでしたが、とにかくあなたの努力に感謝します) – Slauma

+2

+1最後に見つけました! MVVM Light Toolkitの 'CommandParameter'と一緒に' RelayCommand'を使用すると、これは私のために働いていました。 WPFは要素ツリー内の項目がどこにあっても、 'ElementName'を動作させたいと思います。この 'ContextMenu'バインディングバリエーションを共有してくれてありがとう! – SliverNinja

関連する問題