Привязка видимости кнопки к значению 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>
-
Следующее - это логическое свойство, которое содержит значение true/false. Ниже приведен фрагмент кода. В моем примере это свойство находится в классе UserNote.
public bool _isHide = false;
public bool IsHide
{
get { return _isHide; }
set
{
_isHide = value;
OnPropertyChanged("IsHide");
}
}
-
Это свойство IsHide получает значение.
userNote.IsHide = userNote.IsNoteDeleted;