将button的可见性绑定到ViewModel中的bool值

我如何将一个button的可见性绑定到我的ViewModel中的布尔值?

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

假设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属性上自己完成转换(也就是使属性本身的types为Visibility ),尽pipe我不想这样做,因为现在你正在搞分离关注点。 一个项目的可见性应该真正取决于视图。

还有第三种方法不需要转换器或对视图模型进行更改:使用样式:

 <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不为null的情况下显示元素,或者在不同布局显示的情况下显示元素在视图模型中设置一个枚举。

在C#中从布尔到可见性的2路转换

 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; } } } 

一般来说,有两种方法可以做到这一点,一个是转换器类或Viewmodel中的一个属性,它可以为您自动转换值。

如果是一次性转换,我倾向于使用属性方法。 如果你想重复使用,使用转换器。 下面,find一个转换器的例子:

 <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并在布尔和可见性属性上调用它来正确更新。

在视图中:

 <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

但既然你想它绑定到一个布尔值,你将需要一些转换器。 另一种方法是在外部设置一个布尔值,当单击该button时,将property_advancedFormat设置为所需的可见性。

这可以通过一种非常简单的方式来实现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;