2009-09-12 63 views
8

我有一个尝试实现MVVM模式和Prism 2的WPF应用程序。我有一个Usercontrol订阅了从另一个Usercontrol触发的事件。我想切换订阅控件中少量子元素的可见性。事件被正确触发,即使我能成功地将数据绑定到某些元素。如何将Visibility或任何样式属性与ViewModel绑定并动态更改。如何从ViewModel更改WPF控件的可见性

回答

23

您可以在ViewModel中拥有布尔属性并将该属性绑定到控件的Visibility属性。由于您将asigning一个布尔值和可见性属性期待一个能见度枚举值,你将不得不使用BooleanToVisibilityConverter转换器进行转换,

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

希望这有助于。

埃塞基耶尔Jadib

+0

不知何故,这并没有为我工作。我在Usercontrol.Resources部分声明了转换器,并使用了绑定,如您在注释中所述。 – Raj 2009-09-13 03:04:45

+1

对不起我的错误。这工作。谢谢。 – Raj 2009-09-13 04:19:51

8

虽然添加布尔属性和使用值转换器的作品,我会建议加式能见度的属性您视图模型,例如

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

这种方法的优点是你不需要写一个转换器,你想在一个可视化的方式来表达(例如,对于库存水平,轮流标签红色,当它低于10的每个属性,你可以使用一次转换器,或者只是从虚拟机中暴露一个StockLabelBrush属性)

+0

虽然这个答案很高雅,但它有一个问题。如果程序更改'shouldShowImage',则该更改不会发送到视图。 – James 2014-03-19 14:35:37

+1

这是真的,但有几种方法可以解决问题。你可以从'shouldShowImage'处理'PropertyChanged'事件并引发一个新的'PropertyChanged'事件,或者只允许通过引发两个属性的事件的包装器属性来访问'shouldShowImage'。 – Darren 2014-03-19 16:52:33

1

我知道这是一个老问题,但对于遇到此问题并找到答案的人有一个简单的解决方案。

在您的视图模型,创建一个 “可见性” 属性,像这样:

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.CollapsedVisibility.Visible