ContextMenuのMenuItem可視性をListView選択にバインドします
-
06-07-2019 - |
質問
ObservableCollectionからの単純なアイテムを含むListViewを持つユーザーコントロールがあります。そのListViewのContextMenuに、ListViewで選択されているものに応じてアイテムを含めるようにします。アイテムが選択されていない場合、一部のMenuItemは表示されません。
ContextMenuを開いても、コンバーターは呼び出されません。バインディングが間違っているようです。出力ウィンドウでこれを見つけました:
System.Windows.Dataエラー:4:参照 'ElementName = listView'のバインドのソースが見つかりません。 BindingExpression:Path = SelectedItem; DataItem = null;ターゲット要素は 'MenuItem'(Name = '')です。ターゲットプロパティは 'Visibility'(タイプ 'Visibility')
何が間違っているのか理解できず、ウェブを検索してもそれを理解できませんでした。
簡単なコードを次に示します。
<UserControl x:Class="MyApp.DatabaseControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:MyApp"
Height="Auto"
Width="Auto">
<UserControl.Resources>
<l:ValueToVisibilityConverter x:Key="valueToVisibility" />
</UserControl.Resources>
<Grid>
<ListView x:Name="listView" ItemsSource="{Binding Persons}">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="First Name" DisplayMemberBinding="{Binding FirstName}"/>
<GridViewColumn Width="140" Header="Last Name" DisplayMemberBinding="{Binding LastName}" />
</GridView>
</ListView.View>
<ListView.ContextMenu>
<ContextMenu>
<MenuItem
Header="Open"
Visibility="{Binding SelectedItem, ElementName=listView, Converter={StaticResource valueToVisibility}}"/>
<Separator/>
<MenuItem Header="Add..."/>
<MenuItem Header="Remove"/>
</ContextMenu>
</ListView.ContextMenu>
</ListView>
</Grid>
どうもありがとう!
解決
問題は、 ContextMenu
が ListBox
と同じビジュアルツリーにないため、バインディングが ListBox
を見つけられないことです。 PlacementTarget
にバインドする場合は、次のトリックを実行する必要があります。
<MenuItem Header="Open"
Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
Converter={StaticResource valueToVisibility}}" />
所属していません StackOverflow