ViewModel中可见性类型的属性

时间:2013-10-18 11:21:46

标签: c# wpf xaml mvvm

在WPF应用程序中,当您需要从ViewModel触发View元素的可见性时,基本上有两种方法:

方法1:使用bool

class ViewModel
{
    public bool IsMyImageVisible { get; set; }
}

查看:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="booleanToVisibility" />
</Window.Resources>

<Image Visibility="{Binding IsMyImageVisible, Converter={StaticResource booleanToVisibility}}" />

方法2:使用Visibility

class ViewModel
{
    public Visibility MyImageVisibility { get; set; }
}

查看:

<Image Visibility="{Binding MyImageVisibility}" />

问题

  1. “方法2”仍然符合MVVM标准吗?

  2. 我什么时候应该使用“方法1”?

  3. 编辑:将问题更改为不太基于意见。

3 个答案:

答案 0 :(得分:11)

第二个选项将ViewModel绑定到特定技术(WPF)。像某些Web框架这样的另一项技术将具有不同的Visibility枚举。您可能还需要将WPF引用添加到模型项目中,这对于某些场景可能不是一个好主意(因为该项目的所有使用者现在也必须包含该引用)。

如果您在ViewModel中不需要跨框架兼容性,那么您可以使用第二个,而没有任何其他缺点。

答案 1 :(得分:4)

考虑以下情况:

做出以下界面设计决定:它不会隐藏图像,而是像%鬼一样使它成为%10不透明。现在,如果你选择了第二个选项,则必须更改viewmodel代码,因为接口设计会发生变化。但是,如果您采用第一个选项,则修改界面(可能添加BoolToOpacity转换器)以反映该更改。第一个选择更符合MVVM理念。如果你有单独的人在处理界面设计和视图模型代码,那么他们就不必干涉彼此的工作。

答案 2 :(得分:2)

我认为这真的取决于你将如何处理该财产。您的应用程序的某些视图可能只是使图像可见/不可见,但在创建另一个视图时,您可能希望根据图像的可用性显示一个全新的模板。

在这种情况下,它会使Visibility属性有点奇怪。