【问题标题】:Is it a good design to bind to visibility in viewmodel绑定到视图模型中的可见性是一个好的设计吗
【发布时间】:2017-06-02 14:31:01
【问题描述】:

最近我和我的同事正在讨论视图绑定到视图模型中的可见性属性。

在我们的一个项目中,为了使控件可见/折叠,我的同事绑定到可见性属性,并且 viewModel 将在必要时将该属性设置为 Visibility.Visible / Visibility.Collapse。

它有效,但我想知道它是否是一个好的设计。

正如我所想,如果 viewModel 将属性设置为 Visible/collapse,那么 viewModel 知道视图在做什么,相反它应该包含一个 bool 属性,并且视图应该绑定到一个 bool 属性并使用转换器来决定是否使元素可见/折叠。在这种情况下,viewmodel 对视图一无所知。

示例: 如果用户属于一个团队,则显示一个 TextBlock(团队名称)

private bool _isUserBelongsToTeam;
public bool IsUserBelongsToTeam
{
   get { return _isUserBelongsToTeam; }
   set { _isUserBelongsToTeam = value; NotifyPropertyChange("IsUserBelongsToTeam"); }
}

XAML: 
<TextBlock Text= "Team name" Visibility= "{Binding IsUserBelongsToTeam, Converter={StaticResource BoolToVisibilityConverter}}" />

private bool _isTeamVisible;
public bool IsTeamVisible
{
   get { return _isTeamVisible; }
   set { _isTeamVisible= value; NotifyPropertyChange("IsTeamVisible"); }
}

XAML: 
<TextBlock Text= "Team name" Visibility= "{Binding IsTeamVisible}" />

哪种方式更好实施?

【问题讨论】:

标签: wpf mvvm


【解决方案1】:
  1. 请记住,您花更多的时间阅读代码,然后是编写代码。因此,“IsTeamMember”是比“IsTeamVisible”更好的名称。而且 IsUserBelongsToTeam 很糟糕(不合语法):)

  2. 我刚刚在我们的 WPF 应用程序中重写了整个模块。我没有使用单一的“IsXYZVisible”属性。我将 ContentPresenter 与 DataTemplates 一起使用,当我不想显示内容时,我将 ContentPresenter 中的 Content 属性设为 null。这样我就有了:更简单的 xaml,更简单和更小的视图模型,代码更好地反映了视图(如果在调试期间,我看到 XYZ sub-viewModel 属性为空,那么我知道它没有被渲染,我没有搜索 IsXYZVisible 或类似属性),单元测试更简单。

【讨论】:

    【解决方案2】:

    这真的是一个品味问题。在大多数情况下,我个人更喜欢转换器方法。将视图模型属性定义为bool 的好处是它不依赖于任何与视图相关的类型。

    如果您在几种不同类型的客户端应用程序之间共享(或打算共享)您的视图模型,这一点尤其重要。

    但就 MVVM 而言,通过向视图模型类添加 Visibility 属性并没有真正打破这种模式。此外,如果您打算在 ItemsControl 中显示大量视图模型实例,出于性能原因,这实际上可能比使用转换器更好。

    【讨论】:

    • 谢谢mm8。这让我很清楚。如果是一个视图和一个视图模型,那么有可见性是很好的,很多视图和一个视图模型最好有布尔值..
    • 是的,或者更确切地说,如果您打算创建大量视图模型对象并绑定到这些对象,您可能不想使用转换器。
    猜你喜欢
    • 2018-04-21
    • 2020-10-06
    • 1970-01-01
    • 2023-03-07
    • 2017-06-06
    • 2014-01-17
    • 2020-07-20
    • 2013-03-22
    • 2017-11-09
    相关资源
    最近更新 更多