0

テンプレートを次のように宣言しました-

<DataGrid.Resources>

    <ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
        <MenuItem Header="Remove" Command="{Binding Cancel}" />
    </ContextMenu>

</DataGrid.Resources>

行スタイルを使用してテンプレートを適用しています -

<DataGrid.RowStyle>

    <Style TargetType="DataGridRow">
        <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
    </Style>

</DataGrid.RowStyle>

メニューは正常に表示されます

ただし、(ItemListViewModel の) コマンドは、コンテキスト メニュー項目がクリックされたときに実行されません。

public class ItemListViewModel : INotifyPropertyChanged
{
    public void Cancel()
    {
        MessageBox.Show("Cancel test");
    }
...
}

それ以外の場合、バインディングは適切に機能しています。これは、次のようなことができるためです-

    foreach (ItemListViewModel ul in mylist.SelectedItems)
        MessageBox.Show(item.FullDescription);

私はそれを理解しようとして一晩中これにいました。今日WPFを始めたばかりです。

どこが間違っているのか誰か教えてください

4

2 に答える 2

0

簡単な方法に縛ることはできないと思います。インターフェイスの実装である必要があるコマンドにバインドする必要がありICommandます。この場合、そのインターフェイスを実装するクラスを作成し、そのクラスタイプのプロパティをモデルに追加する必要があります。

この例を参照してください:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

于 2012-05-19T16:35:18.473 に答える
0

私は自分のニーズには ListView の方が適していると判断し、代わりにそれを使用しています。コンテキスト メニューをアイテムにバインドしようとしているのではなく、リストビュー全体に対して単一のコンテキスト メニューを用意し、必要に応じて ContextMenuOpen イベントでアイテムを有効または無効にします。

于 2012-05-20T02:20:23.277 に答える