Привязка видимости кнопки к значению bool в ViewModel

Как привязать видимость кнопки к значению bool в моей ViewModel?

<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}"
    Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand"
    Visibility="{Binding Path=AdvancedFormat}" />

Ответ 1

Предполагая, что AdvancedFormat является bool, вам нужно объявить и использовать BooleanToVisibilityConverter:

<!-- In your resources section of the XAML -->
<BooleanToVisibilityConverter x:Key="BoolToVis" />

<!-- In your Button declaration -->
<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}" 
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat, Converter={StaticResource BoolToVis}}"/>

Обратите внимание на добавленный Converter={StaticResource BoolToVis}.

Это очень распространенный шаблон при работе с MVVM. Теоретически вы можете сделать преобразование самостоятельно в свойстве ViewModel (т.е. Просто создать свойство самого типа Visibility), хотя я бы предпочел не делать этого, так как теперь вы возитесь с разделом проблем. Величина элемента должна действительно соответствовать представлению.

Ответ 2

Существует третий способ, который не требует конвертера или изменения модели вашего вида: используйте стиль:

<Style TargetType="Button">
   <Setter Property="Visibility" Value="Collapsed"/>
   <Style.Triggers>
      <DataTrigger Binding="{Binding IsVisible}" Value="True">
         <Setter Property="Visibility" Value="Visible"/>
      </DataTrigger>
   </Style.Triggers>
</Style>

Я предпочитаю этот метод, потому что я использую его во многих случаях, когда то, что я связываю, не является логическим - например. отображение элемента только в том случае, если его DataContext не является нулевым или реализует многоуровневые дисплеи, где появляются разные макеты, основанные на настройке перечисления в модели представления.

Ответ 3

2-стороннее преобразование в С# от boolean до видимости

using System;
using System.Windows;
using System.Windows.Data;

namespace FaceTheWall.converters
{
    class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Boolean && (bool)value)
            {
                return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is Visibility && (Visibility)value == Visibility.Visible)
            {
                return true;
            }
            return false;
        }
    }
}

Ответ 4

Как правило, есть два способа сделать это: класс конвертера или свойство в Viewmodel, которое по существу преобразует значение для вас.

Я склонен использовать подход к свойствам, если это однократное преобразование. Если вы хотите его повторно использовать, используйте конвертер. Ниже приведен пример преобразователя:

<ValueConversion(GetType(Boolean), GetType(Visibility))> _
Public Class BoolToVisibilityConverter
    Implements IValueConverter

    Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

        If value IsNot Nothing Then
            If value = True Then 
                Return Visibility.Visible
            Else
                Return Visibility.Collapsed
            End If
        Else
            Return Visibility.Collapsed
        End If
    End Function

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException
    End Function
End Class

Метод свойства ViewModel будет просто проверять значение свойства boolean и возвращать видимость на основе этого. Обязательно внедрите INotifyPropertyChanged и назовите его как для свойств Boolean, так и для Visibility, чтобы их обновить правильно.

Ответ 5

В представлении:

<Button
 Height="50" Width="50"
 Style="{StaticResource MyButtonStyle}"
 Command="{Binding SmallDisp}" CommandParameter="{Binding}" 
Cursor="Hand" Visibility="{Binding Path=AdvancedFormat}"/>

В поле зрения Модель:

public _advancedFormat = Visibility.visible (whatever you start with)

public Visibility AdvancedFormat
{
 get{return _advancedFormat;}
 set{
   _advancedFormat = value;
   //raise property changed here
}

Вам нужно будет изменить событие с изменением свойств

 protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
        PropertyChanged.Raise(this, e); 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

Вот как они используют Model-view-viewmodel

Но так как вы хотите привязать его к логическому, вам понадобится конвертер. Другой способ - установить логическое значение снаружи и нажать эту кнопку, а затем установить свойство_advancedFormat на нужную видимость.

Ответ 6

Это может быть достигнуто очень простым способом 1. Напишите это в представлении.

<Button HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="30">
<Button.Style>
        <Style TargetType="Button">
                <Setter Property="Visibility" Value="Collapsed"/>
                        <Style.Triggers>
                                <DataTrigger Binding="{Binding IsHide}" Value="True">
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                            </Style.Triggers>
            </Style>
    </Button.Style>

  1. Следующее - это логическое свойство, которое содержит значение true/false. Ниже приведен фрагмент кода. В моем примере это свойство находится в классе UserNote.

    public bool _isHide = false;
    
    public bool IsHide
    {
    
    get { return _isHide; }
    
    set
        {
            _isHide = value;
                OnPropertyChanged("IsHide");
        }
    } 
    
  2. Это свойство IsHide получает значение.

    userNote.IsHide = userNote.IsNoteDeleted;