我正在使用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