Привязать видимость двух элементов к одному свойству

#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}}" >