У меня есть ContextMenu, прикрепленный к ListBox, который предлагает два варианта: создать и удалить элемент. Я хочу скрыть только элемент «Удалить», если данные ListBox пусты.
Я попытался связать свойство «Видимость» с переменной в коде представления, установив для него значение «Свернуто» или «Видимо», но это не сработало.
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;
}
}
Спасибо
почему вы не можете сделать что-то вроде Visibility = "{Binding ElementContextMenuVisibility, Converter = {StaticResource BoolToVis}}" в App.xaml <BooleanToVisibilityConverter x: Key = "BoolToVis" /> и связать Visibility с некоторым логическим свойством





Вы можете достичь этого с помощью привязки 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>
Фантастический ! Это именно то, что я искал. Спасибо.
Добавьте к своему вопросу ошибки привязки данных, которые вы видите в окне вывода Visual Studio.