1

WPF .Net 4 アプリケーションでは、内部データグリッドを持つ RowDetailsTemplate にあるように、データグリッドに詳細情報を持つことができる行があるマスター詳細状況があります。

RowDetailsTemplate 内には、コンテキスト メニューを持つサブ詳細を保持するためのグリッドがあります。見つかった問題は、詳細の MenuItem の 1 つの CommandTarget をバインドするときに、テンプレートによって生成された詳細データグリッドをターゲットにできないことです。以下のバインディングは、詳細情報/コンテキストメニューを保持している包含​​データグリッドではなく、マスターデータグリッドを取得することになります。

<DataGrid x:Name="dgEditScript" ItemsSource="{Binding CurrentScript}">

<DataGrid.CommandBindings>
    <CommandBinding Command="commands:ScriptingCommands.SetChecked"
                    Executed="CheckAllAfter" />
</DataGrid.CommandBindings>

<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <DataGrid ItemsSource="{Binding SubCommands}">
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Check All From Selected"
                              Command="commands:ScriptingCommands.SetChecked"
                              CommandTarget="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
                        <MenuItem.Icon>
                            <Image Source="Images/checkboxes.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
    </DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>

上記の Realtive ソース バインディングを使用する場合の問題は、dgEditScript グリッド (トップ レベル) であり、コンテキスト メニューの親ではなく、コンテキスト メニューが起動された名前のない保持 DataGrid です。

バインディングでサブ グリッドを取得するにはどうすればよいですか。コンテキストメニューの親をターゲットにするには?

4

1 に答える 1

0

私があなたの質問を正しく理解している場合、アイテムのコレクションがあり、選択したアイテムにコンテキストメニューを追加したい(右クリックしたとき...)

私が使用している同様のコードは次のとおりです。

<ListBox x:Name="name_here"  
      ItemsSource="{Binding source_collection_name}"
      SelectedItem="{Binding property_name_on_VM, UpdateSourceTrigger=PropertyChanged}"
       >
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Header ="Edit Item"   Command="{Binding EditItem_Command}" 
                      CommandParameter="{Binding property_name_on_VM}"
            />
            <MenuItem Header ="Delete Item" Command="{Binding DeleteItem_Command}" 
                       CommandParameter="{Binding property_name_on_VM}"
            />
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>

この方法では、項目をクリック (または右クリック) するたびに選択され、その項目をコマンド パラメーターとして送信するだけで、必要な項目を取得できます。

お役に立てれば。

于 2013-10-12T04:01:09.630 に答える