【问题标题】:Getting to grips with MVVM with WPF使用 WPF 掌握 MVVM
【发布时间】:2011-05-08 23:48:35
【问题描述】:

我刚刚收到了一些关于带有 wpf、c# 的 MVVM 的设计/实现问题。我只是想掌握 MVVM 并且正在徘徊是否有人可以确认我的想法,在我的应用程序中,我需要一个员工、一个部门和一个公司成立。所以换句话说,我有一个员工模型和一个相应的员工 ViewModel。现在,当用户单击新员工时,会弹出一个窗口,其中包含 4 个东西、2 个组合框和员工姓名字段和一个提交按钮。现在我的主要关注点是如何管理 2 个组合框,一个用于公司,一个用于部门?

现在我还有两个模型分别用于公司和部门以及视图模型,因为我需要能够添加新的公司或部门。

所以我的第一个问题归结为我是在员工视图模型中使用公司和部门模型,还是将下拉框绑定到公司或部门的单独视图模型?如果是这样,我将如何获得组合框的详细信息,如果以第二种方式完成?

我的第二个问题是,如果您将数据网格绑定到 EmployeeListViewModel,如果在employeelistviewmodel 中的列表中发生任何更改,该数据网格会自动更新还是我必须调用一个重新检查列表的函数还是我必须重新绑定吗??

任何帮助都会很棒:)

谢谢大家

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    不要将员工视图模型视为员工的模型。将其视为员工视图的模型。因此,将出现在员工视图中的所有内容都需要出现在视图模型中——包括在该视图中填充组合框所需的任何内容——因此将有一个 Companies 属性和一个 Departments 属性那些组合框的ItemSource 属性将绑定到。

    您可能拥有公司和部门的视图模型,它们将支持用于显示/修改这些对象的视图。这通常是与在组合框项目中显示这些对象的描述完全不同的问题。 (但并非总是如此 - 例如,如果组合框项在绑定到的项发生更改时需要更新,您需要将它们绑定到支持属性更改通知的视图模型。)

    就您的第二个问题而言,如果您有一个 ItemsControl,其 ItemsSource 绑定到视图模型对象的集合,只要这些视图模型支持更改通知(这是实现视图模型),并存储在支持更改通知的集合中(如可观察集合),自动保持ItemsControl同步。

    【讨论】:

      【解决方案2】:

      具有 2 个组合框的视图需要公开公司和部门项目的集合。这些可能只是模型,但如果将其包装在视图模型中会更好。我假设当您选择一家公司时,部门列表将被更新。您可以查看我为 Cascading combo boxes 建议的解决方案,该解决方案根据对其父项的选择更新子列表

      至少您有一个要绑定到 ComboBox 的项目列表和一个选定项目的属性。我使用“ItemListViewModel”将它们组合在一起。

      class MyViewModel : INotifyPropertyChanged
      {
        public MyViewModel()
        {
          Companies = new ItemListViewModel<string>();
          Departments = new ItemListViewModel<string>();
          ...
       }
      
        public ItemListViewModel<string> Companies { get; set; }
        public ItemListViewModel<string> Departments { get; set; }
      }
      

      在 XAML 中

      <ComboBox ItemsSource="{Binding Companies}" />
      <ConboBox ItemsSource="{Binding Departments}" />
      

      至于基础知识的入门,还有很多其他的帖子会涉及到这一点,但对于 ComboBox 设计,以上内容应该会有所帮助。

      对于您的第二个问题,只要您的 ViewModel 实现 INotifyPropertyChanged,它就会更新对象绑定到的控件。

      【讨论】:

        【解决方案3】:

        我会将公司和部门数据放在员工 ViewModel 中。 以 Company 为例,我将拥有两个属性

        ObservableCollection<CompanyViewModel> ListOfCompanies;
        CompanyViewModel SelectedCompany;
        

        ListOfCompanies 绑定到组合框的 itemsource 并且 SelectedCompany 绑定(双向)到组合框的 selectedItem。 这样,您可以在 viewmodel 中设置选定的公司,它会更新 UI,并且 viewmodel 也将在 UI 更改时更新。

        根据您填充 ListOfCompanies 和 SelectedCompany 的方式,您可能需要 CompanyViewModel 来实现以下接口。

        IComparable<CompanyViewModel>, IEquatable<CompanyViewModel> 
        

        绑定将完成剩下的工作。

        至于自动更新您的员工数据网格,我更喜欢自己使用 ListView,但可观察的员工视图模型集合应该可以很好地刷新。

        这是我的两分钱。

        【讨论】:

          猜你喜欢
          • 2011-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-27
          • 2021-10-09
          相关资源
          最近更新 更多