首页 文章

仅查看属性(例如:IsSelected)和MVVM中的模型

提问于
浏览
6

考虑使用MVVM编写的WPF应用程序 . 应用程序需要显示Employees列表(FirstName,LastName,Title),您可以选择要删除的多个 .

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

View将是“ EmployeeListView ”,它将实现XAML以显示Employees的集合 .

ViewModel将是“ EmployeeListViewModel ”,它将公开 ObservableCollection ,可以绑定到 EmployeeListView .

我的问题是:“ IsSelected ” property 应该在哪里居住?

  • In the Model? (我不喜欢这个想法,因为模型现在暴露了一个只有视图所需的属性而且与实际的域对象无关,而且,如果我以不同的方式实现视图,这个属性将毫无用处 . 不允许一次删除多名员工) .

  • 在“ EmployeeListViewModel ”中作为单独的字典集合,可以跟踪是否选择了员工? (或者甚至只是包含所有选定员工的HashSet) . 我不喜欢这个,因为视图中的绑定不再是直截了当的 .

  • Implement a separate EmployeeViewModel ,包装Employee对象并公开IsSelected属性 . 然后EmployeeListViewModel将其集合公开为ObservableCollection . 我最喜欢这个解决方案,但我一直认为每个View有一个ViewModel,在这种情况下,我的视图有2个视图模型 . Is that a deviation from the MVVM pattern or is this the typical way to implement MVVM? (参考?)

1 回答

  • 6

    创建一个可重用的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;}
    

    并在视图中:

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

    然后您可以通过以下方式检索所有选定的员工

    var selectedemployees = Employees.Where(x => x.IsSelected).Select(x => x.Value);
    

相关问题