Привязка видимости кнопки к значению bool во ViewModel - PullRequest
113 голосов
/ 09 августа 2011

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

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

Ответы [ 6 ]

186 голосов
/ 09 августа 2011

Предполагая, что 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), хотя я бы предпочел этого не делать, поскольку теперь вы возитесь с разделением интересов,Видимость предмета должна действительно зависеть от вида.

89 голосов
/ 09 августа 2011

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

<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 не является нулевым, или реализация многоуровневых дисплеев, где появляются различные макеты на основе установки перечисления впосмотреть модель.

10 голосов
/ 02 января 2014

2 способа преобразования в c # из логического значения в видимость

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 голосов
/ 09 августа 2011

Обычно есть два способа сделать это: класс преобразователя или свойство в 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 будет просто проверять значение логического свойства и возвращать видимость, основанную на этом. Обязательно реализуйте INotifyPropertyChanged и вызывайте его как для логических свойств, так и для свойств Visibility, чтобы они обновлялись должным образом.

3 голосов
/ 10 августа 2011

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

<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

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

2 голосов
/ 23 сентября 2015

Это может быть достигнуто очень простым способом 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;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...