使用列表投标 contextmenu menuitem 可见性

Biding contextmenu menuitem visibility with a list

我有一个附加到列表框的上下文菜单,它提供两个选项:创建和删除元素。如果 ListBox 数据为空,我只想隐藏 "Delete" 元素。

我试图将 属性 "Visibility" 与视图代码中的一个变量绑定,将其设置为 "Collapsed" 或 "Visible",但没有成功.

XAML :

<ListBox ItemsSource="{Binding ElementList}"
         SelectedItem="{Binding SelectedElement}"
         SelectionChanged="ListBoxProjects_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Name}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Name="Add" Click="Add_Click" Header="Add element" />
            <MenuItem Name="Delete" Click="Delete_Click" 
                      HeaderStringFormat="Delete element {0}" 
                      Header="{Binding SelectedElement.Name}" 
                      Visibility="{Binding ElementContextMenuVisibility}" />
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>

CS :

public partial class View : UserControl
{
    private ViewModel _viewModel = ViewModel.Instance;

    private Visibility _elementContextMenuVisibility { get; set; }
    public Visibility ElementContextMenuVisibility
    {
        get { return _elementContextMenuVisibility; }
        set { _elementContextMenuVisibility = value; }
    }

    public View()
    {
        InitializeComponent();
    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (_viewModel.ElementList != null && _viewModel.ElementList.Count > 0)
            ElementContextMenuVisibility = Visibility.Visible;
        else
            ElementContextMenuVisibility = Visibility.Collapsed;
    }
}

谢谢

您可以通过 RelativeSource 绑定实现此目的,无需 xaml.cs 代码。

XAML

<ListBox ItemsSource="{Binding ElementList}"
         SelectedItem="{Binding SelectedElement}">
    <ListBox.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Name}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ContextMenu>
        <ContextMenu>
            <MenuItem Name="Add" Click="Add_Click" Header="Add element" />
            <MenuItem Name="Delete" Click="Delete_Click" 
                      HeaderStringFormat="Delete element {0}" 
                      Header="{Binding SelectedElement.Name}" 
                      Visibility="{Binding PlacementTarget.HasItems, RelativeSource={RelativeSource AncestorType=ContextMenu}, Converter={StaticResource BooleanToVisibilityConverter}}" />
        </ContextMenu>
    </ListBox.ContextMenu>
</ListBox>