wpf - 仅查看属性(例如 : IsSelected) and the Model in MVVM

标签 wpf design-patterns mvvm model

考虑一个使用 MVVM 编写的 WPF 应用程序。该应用程序需要显示员工列表(名字、姓氏、职务),您可以选择多个进行删除。

在这种情况下,模型将是“ Employee ”,它将实现 INotifyPropertyChanged .

View 将是“ EmployeeListView ”,它将实现 XAML 以显示员工集合。

ViewModel 将是“ EmployeeListViewModel ”,这将公开 可观察集合 , 可以绑定(bind)到 员工列表查看 .

我的问题是:“ IsSelected ”属性应该在哪里?

  • 在模型中? (我不喜欢这个想法,因为模型现在正在公开一个仅由 View 需要的属性,并且与实际的域对象无关,此外,如果我以不同的方式实现 View 并且不允许,该属性将毫无用处一次删除多个员工)。
  • 在“ EmployeeListViewModel ”作为单独的 Dictionary 集合中,它会跟踪是否选择了员工? (或者甚至只是一个包含所有选定员工的 HashSet)。我不太喜欢这个,因为 View 中的绑定(bind)不再是直截了当的。
  • 实现一个单独的 EmployeeViewModel ,它包装了 Employee 对象并公开了 IsSelected 属性。然后,EmployeeListViewModel 会将其集合公开为 ObservableCollection。我最喜欢这个解决方案,但我一直认为每个 View 有一个 ViewModel,在这种情况下,我的 View 有 2 个 View 模型。 这是与 MVVM 模式的偏差还是这是实现 MVVM 的典型方式? (引用?)
  • 最佳答案

    创建一个可重用的 Generic SelectableItem 来包装 EmployeeList 中的每个项目:

    简单的例子:

    public class SelectableItem<T>: INotifyPropertyChanged
    {
        public bool IsSelected {get;set;} //PropertyChanged(), etc
    
        public T Value {get;set;}
    }
    

    然后在 ViewModel 中:
    public ObservableCollection<SelectableItem<Employee>> Employees {get;set;}
    

    在 View 中:
    <DataTemplate>
       <CheckBox IsChecked="{Binding IsSelected}" Content="{Value.FullName}"/>
    </DataTemplate>
    

    然后,您可以通过以下方式检索所有选定的员工:
    var selectedemployees = Employees.Where(x => x.IsSelected).Select(x => x.Value);
    

    关于wpf - 仅查看属性(例如 : IsSelected) and the Model in MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178942/

    相关文章:

    c# - MVVM - 如何使格式化属性保持最新?

    c# - System.IO.Ports 5.0 NuGet 包在我的解决方案中不起作用

    c# - 将本地数据库放在 Visual Studio 解决方案中的什么位置?

    c# - MVVM没有收到消息

    wpf - 如何使用 MVVM 以编程方式将列添加到 wpf 数据网格?

    oop - 使用接口(interface)的真正好处是什么?

    非子 pid 的 C++ 信号监听器

    c# - 访问者模式是将域枚举重构为类的最佳方式吗?

    c# - 如果构造函数不应该做任何工作,那么如何在 MVVM 中初始化 Views 和 ViewModels

    c# - 当您绑定(bind)到 ItemSsource 时内部会发生什么?