如何从ViewModel更改WPF控件的可见性

时间:2009-09-12 19:43:03

标签: wpf mvvm prism

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

3 个答案:

答案 0 :(得分:24)

您可以在ViewModel中拥有布尔属性,并将该属性绑定到控件的Visibility属性。由于您将使用布尔值进行设置并且Visibility属性需要可见性枚举值,因此您必须使用BooleanToVisibilityConverter转换器进行转换,

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

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

希望这有帮助。

Ezequiel Jadib

答案 1 :(得分:9)

虽然添加布尔属性并使用值转换器,但我建议将类型为Visibility的属性添加到ViewModel中,例如

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

这种方法的优点是你不需要为你想要以可视方式表达的每个属性编写一个转换器(例如,当一个标签在低于10时将标签变成红色时,你可以有一个转换器您使用一次或只是从您的VM公开StockLabelBrush属性

答案 2 :(得分:2)

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

在您的视图模型中,创建一个“可见性”属性,如下所示:

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