6

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

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

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

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

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

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

1 回答 1

8

创建一个可重用的 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);
于 2013-08-12T03:11:24.433 回答