【发布时间】:2010-11-27 19:21:37
【问题描述】:
我有一个 WPF 应用程序,试图实现 MVVM 模式和 Prism 2。我有一个用户控件,它订阅了另一个用户控件触发的事件。我想在订阅控件中切换几个子元素的可见性。事件被正确触发,即使我成功地将数据绑定到某些元素。如何将 Visibility 或任何样式属性与 ViewModel 绑定并动态更改它们。
【问题讨论】:
我有一个 WPF 应用程序,试图实现 MVVM 模式和 Prism 2。我有一个用户控件,它订阅了另一个用户控件触发的事件。我想在订阅控件中切换几个子元素的可见性。事件被正确触发,即使我成功地将数据绑定到某些元素。如何将 Visibility 或任何样式属性与 ViewModel 绑定并动态更改它们。
【问题讨论】:
您可以在 ViewModel 中拥有一个布尔属性并将该属性绑定到控件的 Visibility 属性。由于您将分配一个布尔值并且 Visibility 属性需要一个 Visibility 枚举值,因此您必须使用 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,则该更改不会发送到视图。
shouldShowImage 的PropertyChanged 事件并引发新的PropertyChanged 事件,或者只允许通过引发两个属性的事件的包装器属性访问shouldShowImage。
对于遇到此问题的人来说,有一个简单的解决方案。
在您的视图模型中,像这样创建一个“可见性”属性:
public 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));
在您的 XAML 中,像这样绑定到它:
<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/>
现在,在您的视图模型中,您可以根据需要将ShowModifyButtons 设置为Visibility.Collapsed 或Visibility.Visible。
【讨论】: