我正在使用MVVM的Windows Phone应用程序,但是我正在努力为MVVM的实现寻求需要从模型类格式化以显示在视图中的属性。MVVM - 如何使格式化的属性保持最新?
假设我有一个名为Person
的简单模型类。
public class Person {
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
有是从本地保存的文件加载Person
对象的列表,我要显示一个列表页面上的人员名单,然后让一个人的用户水龙头导航到细节页面,其中有关于此人的更多详细信息。
在列表页,我想说明人的生日定为“生日:1980年2月22日”(其中“1980年2月22日”是人的格式化Birthday
)
在详细信息页面,我想以不同的格式显示此人的生日:“Eric的生日是2/22/1980”(其中“Eric”是该人的Name
,“2/22/1980”是该人格式化的Birthday
)。
通常情况下,我只想创建正确格式化Birthday
视图模型:
public class PersonViewModel {
private Person person;
public PersonViewModel(Person person) {
this.person = person;
}
public string BirthdayForList {
get {
return "Birthday: " + person.Birthday.ToString("ddd", CultureInfo.CurrentCulture);
}
}
public string BirthdayForDetails {
get {
return person.Name + "'s birthday is " + person.Birthday.ToString("ddd", CultureInfo.CurrentCulture);
}
}
}
为了显示在UI这些价值观,我会创建这些视图模型对象的集合(和它们绑定到视图):
ObservableCollection<PersonViewModel> Items
现在,做我想做的,当一个人的生日(某处细节页)更新,并确保Items
已经更新了最新BirthdayForList
和BirthdayForDetails
属性,同时在本地保存Person
?
我想保持一切都很简单,无需每次需要更新值时手动更新Person
对象的保存列表和PersonViewModel
对象的列表。
这样做的最好方法是什么?我是否应该使用PersonViewModel
对象的ObservableCollection
?另外,我在这个网站上的几个地方看过,模型类不应该实现NotifyPropertyChanged
。 (注意:我已经简化了这个问题的问题,您应该假设我需要许多其他方法来在整个应用程序中格式化Birthday
属性,以及需要格式化的模型类中的其他属性。不同在不同的页面)
感谢您的回答,鲍勃。对于第一种选择,我将如何实现“['User']'的生日是['Birthday']”?我想为此使用一个“TextBlock”。对于第二种选择,我关心这将如何扩展。我需要创建几十个转换器。实际的应用程序比上面的示例更复杂,需要格式化更多的属性。另外,为什么我不想在视图模型中存储格式? – epaps
您可以使用MultiBinding实现第一个选项。但是,这在WP上不可用。使用Cimbalino Windows Phone工具包的MultiBindingBehavior获得相同的结果。 http://www.pedrolamas.com/2013/05/17/cimbalino-windows-phone-toolkit-multibindingbehavior/ – sacha