Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 仅查看属性(例如:IsSelected)和MVVM中的模型_Wpf_Design Patterns_Mvvm_Model - Fatal编程技术网

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

Wpf 仅查看属性(例如:IsSelected)和MVVM中的模型,wpf,design-patterns,mvvm,model,Wpf,Design Patterns,Mvvm,Model,考虑一个正在使用MVVM编写的WPF应用程序。该应用程序需要显示员工的名字、姓氏、头衔列表,您可以选择多个要删除的内容 本例中的模型是Employee,它将实现INotifyPropertyChanged 该视图将是EmployeeListView,它将实现XAML以显示员工的集合 ViewModel将是EmployeeListViewModel,它将公开一个可观察的集合,该集合可以绑定到EmployeeListView 我的问题是:被选中的房产应该住在哪里 在模型中?我不喜欢这个想法,因为现在

考虑一个正在使用MVVM编写的WPF应用程序。该应用程序需要显示员工的名字、姓氏、头衔列表,您可以选择多个要删除的内容

本例中的模型是Employee,它将实现INotifyPropertyChanged

该视图将是EmployeeListView,它将实现XAML以显示员工的集合

ViewModel将是EmployeeListViewModel,它将公开一个可观察的集合,该集合可以绑定到EmployeeListView

我的问题是:被选中的房产应该住在哪里

在模型中?我不喜欢这个想法,因为现在的模型只公开了一个视图所需的属性,而该属性与实际的域对象无关,而且,如果我以不同的方式实现视图,并且不允许同时删除多个雇员,那么该属性将是无用的。 在EmployeeListViewModel中作为一个单独的字典集合,它将跟踪是否选择了员工?甚至只是包含所有选定员工的哈希集。我不喜欢这个,因为视图中的绑定不再是直接的。 实现一个单独的EmployeeViewModel,它包装Employee对象并公开IsSelected属性。然后,EmployeeListViewModel将其集合公开为ObservableCollection。我最喜欢这个解决方案,但我一直认为每个视图有一个视图模型,在这种情况下,我的视图有两个视图模型。这是对MVVM模式的偏离,还是这是实现MVVM的典型方式?推荐人?
创建一个可重用的通用SelectableItem,用于包装EmployeeList中的每个项目:

简单的例子:

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

    public T Value {get;set;}
}

我确实喜欢这个解决方案。但是,尽管我确实询问了IsSelected的实现,但我的问题也是关于一个视图使用多个ViewModel是否符合MVVM的规定。另外,SelectableItem不是一个视图模型吗?在这种情况下,它类似于我的解决方案3,但只是以一种更通用的方式实现的?如果我有更多特定于用户界面的项目要跟踪——IsChecked、IsSelected等等,并且不是所有的用户界面都需要这些不同的属性来跟踪,那么trackedIt完全可以接受在视图中有多个VM。事实上,您可以认为视图上的每个控件都是视图本身。最好的例子是当你有一个DataGrid的时候,每一行都有自己的虚拟机。如果有一件事我可以回到5年前告诉自己,那就是永远不要害怕做一个视图模型!我更喜欢项而不是值,因为值可能与可空类型混淆
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);