gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:59:55 25 4
gpt4 key购买 nike

考虑一个使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com