私の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"
}
今私の問題は、parameter
がnull
の場合、コンテキストメニュー項目をクリックすると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
のプロパティにバインドするのは間違っていますか?まったく可能ですか?
ありがとうございました!
ありがとう、ありがとう、この作品! (今では、コードが正確に何をしているかを理解するために、WPFバインディングについて少しだけ読む必要があります)) – Slauma
ツリーを歩いて、そのタイプに一致するアイテムを見つけようとしています。最初のものは、それをバインディング・コンテキストとして使用します。 – CodeWarrior
それまでのところ、私はバインディングについて詳しく読んだことがあります。なぜ、私の元のマークアップがうまくいかなかったのか、あなたのコードが正しい方法であるのは明らかです。説明をありがとう! – Slauma