#wpf
#wpf
Вопрос:
У меня есть два элемента пункта меню — «Восстановить» и «Удалить», которые имеют дополнительную видимость: когда один отображается, другой скрыт.
В коде ViewModel у меня есть свойство зависимости FilesSelectedCanBeUndeleted, определенное следующим образом:
private bool _filesSelectedCanBeUndeleted;
public bool FilesSelectedCanBeUndeleted
{
get
{
return _filesSelectedCanBeUndeleted;
}
set
{
_filesSelectedCanBeUndeleted = value;
OnPropertyChanged("FilesSelectedCanBeUndeleted");
}
}
XAML для кнопки восстановления выглядит следующим образом:
<MenuItem Header="Undelete" Command="{Binding UndeleteCommand }"
Visibility="{Binding Path=FilesSelectedCanBeUndeleted,
Converter={StaticResource BoolToVisConverter}}" >
Как вы можете видеть, видимость восстановления привязана к выбранному файлу, который может быть удален
свойство (с помощью BooleanToVisibilityConveter).
Теперь мой вопрос в том, как я могу написать XAML, чтобы привязать видимость кнопки удаления к значению «NOT» свойства FilesSelectedCanBeUndeleted?
Спасибо,
Ответ №1:
Здесь приведен пример пользовательского IValueConverter, который позволяет вам изменить логику видимости. По сути, один элемент меню будет виден, когда ваше свойство view-model имеет значение true, а другой будет свернут.
Итак, вам нужно было бы определить два экземпляра конвертера следующим образом:
<local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<local:BooleanToVisibilityConverter x:Key="ReversedBooleanToVisibilityConverter" IsReversed="true" />
Ответ №2:
Вы можете использовать применить datatrigger к вашему menuitem, чтобы избежать другого свойства в вашей viemodel, подобного этому —
<MenuItem Header="Delete"
Command="{Binding DeleteCommand }">
<MenuItem.Style>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding FilesSelectedCanBeUndeleted}" Value="False">
<Setter Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</MenuItem.Style>
</MenuItem>
Ответ №3:
Создайте новое свойство в вашей ViewModel и просто отмените ‘FilesSelectedCanBeUndeleted’, а затем привяжите к нему.
Комментарии:
1. Да, именно этим я сейчас и занимаюсь. Это работает, но я надеюсь, что смогу обойтись без создания несколько избыточного свойства. Спасибо.
Ответ №4:
Некоторое время назад я делал нечто подобное с простым отрицанием…
private bool _filesSelectedCanBeUndeleted;
public bool FilesSelectedCanBeUndeleted{
get{
return _filesSelectedCanBeUndeleted;
}
set{
_filesSelectedCanBeUndeleted = value;
OnPropertyChanged("FilesSelectedCanBeUndeleted");
// You have also to notify that the second Prop will change
OnPropertyChanged("FilesSelectedCanBeDeleted");
}}
public bool FilesSelectedCanBeDeleted{
get{
return !FilesSelectedCanBeUndeleted;
}
}
Тогда Xaml мог бы выглядеть примерно так….
<MenuItem Header="Delete"
Command="{Binding DeleteCommand }"
Visibility="{Binding Path=FilesSelectedCanBeDeleted, Converter={StaticResource BoolToVisConverter}}" >