在viewmodel中绑定到可见性是一个很好的设计吗?

时间:2017-06-02 14:31:01

标签: wpf mvvm

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

在我们的一个项目中,为了使控件可见/折叠我的同事绑定到可见性属性,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}" />

哪种方式更好实现?

2 个答案:

答案 0 :(得分:1)

  1. 请记住,您花了更多时间阅读代码,然后写作。因此,IsTeam会员&#39;是一个更好的名字然后是'IsTeamVisible&#39;。并且IsUserBelongsToTeam很糟糕(不合语法):)

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

答案 1 :(得分:0)

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

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

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