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

时间:2013-08-12 02:51:57

标签: wpf design-patterns mvvm model

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

此案例中的模型为“员工”,并且会实施 INotifyPropertyChanged

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

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

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

  1. 在模型中?(我不喜欢这个想法,因为模型现在暴露了一个只有视图所需的属性,并且与实际的域对象无关,如果我以不同方式实现视图并且不允许一次删除多个员工,那么属性将毫无用处。)
  2. 在“ EmployeeListViewModel ”中,作为单独的词典集合,可以跟踪是否选择了员工? (或者甚至只是包含所有选定员工的HashSet)。我不喜欢这个,因为视图中的绑定不再是直接的。
  3. 实现单独的EmployeeViewModel ,它包装Employee对象并公开IsSelected属性。然后EmployeeListViewModel将其集合公开为ObservableCollection。我最喜欢这个解决方案,但我一直认为每个View有一个ViewModel,在这种情况下,我的视图有2个视图模型。 这是偏离MVVM模式还是这是实现MVVM的典型方式? (引用?)

1 个答案:

答案 0 :(得分: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);