質問

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}}" />
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top