1

我有以下模型:

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;}
    }
}

然后我添加了用于添加新人员的属性。在视图中,我需要一个用于 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 的网格中,我还可以直接绑定到“SelectedCity.Name”而不是额外的属性 CityName。网格也是只读的。

4

2 回答 2

2

你有多个问题;

1 - 您不需要在AllPersonViewModel. 只需声明一个 ObservableCollection Person

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

3-不要添加Name属性。将文本框绑定到Person.

于 2013-01-18T11:41:00.823 回答
1

您的问题真的归结为“可以将我的模型直接暴露在视图中吗?” 一些纯粹主义者会说不,而另一些人会说拥有一个包装模型而不添加任何新功能的视图模型是多余的。

在我看来,这取决于手头的任务,但是当您需要添加不属于模型的其他状态时,“跳过”视图模型可能会回来并咬住您。如果有疑问使用视图模型,但例如在列表中公开简单模型对象时,您通常不需要视图模型提供的额外层。

在您的情况下,您选择了“纯粹主义”解决方案,并且由于您的模型对象不支持INotifyPropertyChanged,如果模型属性被多个来源更改,您将无法摆脱视图模型。但是,CityName您可以绑定到SelectedCity.Name. WPF 支持数据绑定表达式中的属性导航。

要更深入地了解这个主题,你可以谷歌mvvm expose model

于 2013-01-18T12:12:53.040 回答