5

在 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”?

编辑:将问题更改为较少基于意见。

4

3 回答 3

11

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

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

于 2013-10-18T11:27:28.693 回答
4

考虑以下场景:

做出以下界面设计决策: 不是隐藏图像,而是将其设置为 %10 不透明,就像幽灵一样。现在,如果您选择第二个选项,由于界面设计更改,您将不得不更改视图模型代码。但是,如果您采用第一个选项,那么您修改界面(可能添加一个 BoolToOpacity 转换器)以反映该更改。第一个选项更符合 MVVM 理念。如果你有单独的人从事界面设计和视图模型代码,那么他们就不必干涉彼此的工作。

于 2013-10-18T11:41:49.337 回答
2

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

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

于 2013-10-18T11:27:20.297 回答