4

エラーが発生しました:

System.Windows.Dataエラー:4:参照'ElementName=gridProductViewDataGrid'でバインドするためのソースが見つかりません。BindingExpression:Path = SelectedItem; DataItem = null; ターゲット要素は'MenuItem'(Name ='');です。ターゲットプロパティは「IsEnabled」(タイプ「ブール値」)です

Visual Studioの[出力]ウィンドウで、私のコードは本来の機能を実行しません。

追加は無効にする必要はありませんが、削除は無効にされていないため、正常に機能します。

<DataGrid AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" CanUserDeleteRows="False" EnableRowVirtualization="True" ItemsSource="{Binding Items, Mode=TwoWay}" x:Name="gridViewProductDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" >
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="{Binding LabelStrings.AddProductLabel, Source={StaticResource ResourceWrapper}}" Click="Add_Product_MenuItem_Click"/>
                <MenuItem Header="{Binding LabelStrings.RemoveProductLabel, Source={StaticResource ResourceWrapper}}" Click="Remove_Product_MenuItem_Click" IsEnabled="{Binding ElementName=gridViewProductDataGrid, Path=SelectedItem, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ObjectToBooleanConverter}}"/>
                </MenuItem>
            </ContextMenu>
        </DataGrid.ContextMenu>

コンバーターが単純に取る場合、オブジェクトがない場合はtrueを返し、オブジェクトが存在する場合はfalseを返します。このコードをグリッドの内外に移動したり、バインディングの一部をさまざまな順序で移動したりしてみました。コードを実行してブレークポイントを設定すると、ブールコンバーターのコードには含まれませんでした。グリッド内にあるのになぜグリッドが見えないのですか?

4

1 に答える 1

5

ContextMenu は、その親とは異なるビジュアル ツリーで開かれるため、名前付きバインディングは機能しません。

次のようなことを試してください:

IsEnabled="{Binding PlacementTarget.DataContext.SelectedItem, 
                    RelativeSource={RelativeSource FindAncestor,AncestorType=ContextMenu}, 
                    Converter={StaticResource ObjectToBooleanConverter}}"

ContextMenu PlacementTarget(DataGrid) を使用して正しい DataContext を取得します。

もう 1 つのオプションはNameScope、ContextMenu に を設定することです。CodeBehind に次の行を追加します。

NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this));

contextMenuContextMenu に付けた名前はどこにありますか

于 2013-01-21T21:44:09.207 に答える