我有一个使用WPF应用程序,尝试实现MVVM模式和Prism 2。我有一个用户控件,已经订阅了从另一个用户控件触发的事件。我想切换订阅控件中几个子元素的可见性。事件已经成功地被触发,我甚至能够成功地将数据绑定到一些元素。如何使用ViewModel绑定Visibility或任何样式属性,并在运行时动态更改它们。
您可以在ViewModel中拥有一个布尔属性,并将该属性绑定到控件的可见性属性。由于您将分配一个布尔值,而可见性属性期望一个可见性枚举值,因此您将需要使用BooleanToVisibilityConverter转换器来进行转换。
<Style.Resources>
<BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
</Style.Resources>
<Image Visibility="{Binding Path=ShowImage,
Converter={StaticResource booleanToVisibilityConverter}}"/>
虽然添加布尔属性并使用值转换器可以实现此功能,但我建议向您的ViewModel添加一个类型为Visibility的属性,例如:
public Visibility ImageVisibility
{
get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed }
}
这种方法的优点在于,您无需为想要以视觉方式表达的每个属性编写转换器(例如,对于当库存水平低于10时将标签变红的情况,您可以只使用一次转换器或者从VM公开一个StockLabelBrush属性)。shouldShowImage
,那么这个变化不会被发送到视图。 - JamesshouldShowImage
的 PropertyChanged
事件并引发新的 PropertyChanged
事件,或者仅通过包装器属性访问shouldShowImage
,为两个属性都引发事件。 - Darrenpublic Visibility ShowModifyButtons
{
get { return (Visibility)GetValue(ShowModifyButtonsProperty); }
set { SetValue(ShowModifyButtonsProperty, value); }
}
public static readonly DependencyProperty ShowModifyButtonsProperty =
DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel),
new UIPropertyMetadata(Visibility.Collapsed));
<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/>
ShowModifyButtons
设置为Visibility.Collapsed
或Visibility.Visible
。