c# - WPF MVVM 设计 ViewModel

标签 c# .net wpf mvvm viewmodel

我有以下模型:

public class Person
{
    public string LastName{get;set;}
    public City City {get;set;}
}

public class City
{
    public string Name {get;set;}
}

我有两个观点:
  • 一个用于显示所有姓氏和城市名称的人
    一个 DataGrid(AllPersonsViewModel)
  • 一种用于添加新人员 (PersonViewModel)

  • 我的 AllPersonsViewModel:
    public class AllPersonViewModel : ViewModel
    {
        public ObservableCollection<PersonViewModel> PersonViewModels {get;set;}
    }
    

    我从以下 PersonViewModel 开始:
    public class PersonViewModel : ViewModel
    {
        private Person _person;
    
        public string Name
        {
            get { return _person.Name;}
            set { _person.Name = value; RaisePropertyChange("Name");}
        }
    
        public string CityName
        {
            get { return _person.City.Name;}
        }
    }
    

    然后我添加了用于添加新人员的属性。在 View 中,我需要一个用于 PersonName 的文本框和一个用于选择城市的组合框:
    public class PersonViewModel : ViewModel
    {
        private Person _person;
    
        public string Name
        {
            get { return _person.Name;}
            set { _person.Name = value; RaisePropertyChange("Name");}
        }
    
        public string CityName
        {
            get { return _person.City.Name;}        
        }
    
        public City SelectedCity 
        { 
            get { return _person.City;}
            set { _person.City = value; RaisePropertyChange("SelectedCity");}
        }
    
        public ObservableCollection<City> Cities {get;set;} 
    }
    

    这是正确的方法吗?这对我来说似乎有点多余。在 AllPersonsView 的网格中,我还可以直接绑定(bind)到“SelectedCity.Name”而不是额外的属性 CityName。网格也是只读的。

    最佳答案

    你有多个问题;

    1 - 您不需要在 AllPersonViewModel 中声明可观察的 View 模型集合.只需声明 Person 的 ObservableCollection .

    2 - 不要添加 CityName属性(property);正如您所说,不需要。

    3-不要添加Name属性(property)。将文本框绑定(bind)到 Person 的 Name 属性.

    关于c# - WPF MVVM 设计 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397609/

    相关文章:

    WPF 简单绑定(bind)验证,使用红色边框

    c# - 如何将 Python 代码与 C#.Net Core 语言集成?

    c# - 如何使用 Google API 版本 2 在 Google 日历中添加 “Where” 条目

    .net - 如何在 WCF 中使用 SSL wsHttpBinding 启用 session

    c# - 本应兼容的不兼容 .NET Standard 程序集?

    c# - 通过 WPF 发送电子邮件使应用程序关闭

    c# - 提取 Windows 文件属性(自定义属性)C#

    c# - Spin 在 Portable Class Library 中等待多次自旋

    java - 弱引用是如何实现的?

    wpf - 将 Image 列添加到 WPF 数据网格并根据另一列中的前两个字符进行填充