视图模型中的可见性类型的属性

本文关键字:类型 属性 可见性 视图 模型 | 更新日期: 2023-09-27 18:35:51

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

方法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"?

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

视图模型中的可见性类型的属性

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

如果 ViewModel 中不需要跨框架兼容性,则可以使用第二个框架,而不会出现任何其他缺点。

请考虑以下场景:

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

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

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