0

同じ質問:ItemsSourceを使用したWPFコンテキストメニュー-各アイテムのコマンドにバインドする方法は?

以下のように実装してみましたが、サイコロはありません。

現在私のXAMLにあります:

<DataGrid.ContextMenu>
            <ContextMenu ItemsSource="{Binding Users}">
                <ContextMenu.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=UID, Converter={StaticResource UserConverter}}"/>
                    </DataTemplate>
                </ContextMenu.ItemTemplate>
                <ContextMenu.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Command" Value="{Binding ReassignFileCommand}" />
                    </Style>
                </ContextMenu.ItemContainerStyle>
            </ContextMenu>
        </DataGrid.ContextMenu>

次を使用すると、コマンドは機能します。

            <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Woooo" Command="{Binding ReassignFileCommand}" />
            </ContextMenu>
        </DataGrid.ContextMenu>

(ソリューション)に変更する必要があります:

<Setter Property="Command" Value="{Binding Path=DataContext.ReassignFileCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
4

1 に答える 1

1

MenuItemのDataContextは、ユーザーコレクションの対応するオブジェクトであり、ContextMenuのDataContextであるUsersプロパティを持つオブジェクトではありません。ほとんどの場合、コマンドはそのContextMenu datacontextクラスに実装されているため、WPFはそれを見つけることができません。このようなバインディングエラーは、デバッグモードの出力ウィンドウで簡単に見つけることができます(http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or- silverlight-application.aspx)

これを修正するには、コマンドをユーザークラスに移動するか、バインディングを変更して正しいクラスを指すようにします(ElementNameまたはRelativeSourceを使用してcontextMenuのdatacontextにバインドします)。

于 2012-04-11T21:49:19.750 に答える