gpt4 book ai didi

c# - MVVM - 如何使格式化属性保持最新?

转载 作者:太空狗 更新时间:2023-10-30 00:41:15 33 4
gpt4 key购买 nike

我正在开发一个使用 MVVM 的 Windows Phone 应用程序,但我正在为需要从模型类格式化以在 View 中显示的属性实现 MVVM 而苦苦挣扎。

假设我有一个名为 Person 的简单模型类。

public class Person {

public string Name { get; set; }
public DateTime Birthday { get; set; }

}

有一个从本地保存的文件加载的Person对象列表,我想在列表页面上显示一个人列表,然后让用户点击一个人进行导航转到详细信息页面,其中有关于此人的更多详细信息。

在列表页面上,我想将此人的生日显示为“Birthday: 2/22/1980”(其中“2/22/1980”是此人的格式化生日)

在详细信息页面上,我想以不同的格式显示此人的生日:“Eric 的生日是 2/22/1980”(其中“Eric”是此人的姓名,“2/22/1980"是此人的格式化生日)。

通常,我会创建一个正确格式化生日的 View 模型:

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 中显示这些值,我将创建这些 View 模型对象的集合(并将它们绑定(bind)到 View ):

ObservableCollection<PersonViewModel> Items

现在,当一个人的生日更新时(在详细信息页面的某处)我该怎么做,并确保 Items 已更新为最新的 BirthdayForListBirthdayForDetails 属性,同时在本地保存 Person

我想保持一切简单,而不必在每次需要更新值时手动更新已保存的 Person 对象列表和 PersonViewModel 对象列表。

执行此操作的最佳方法是什么?我应该使用 PersonViewModel 对象的 ObservableCollection 吗?此外,我在该网站的多个地方都读到模型类不应实现 NotifyPropertyChanged

(注意:我已经简化了这个问题的问题。您应该假设我需要使用许多其他方法来格式化整个应用程序中的 Birthday 属性以及模型中的其他属性需要在不同页面上以不同方式格式化的类。)

最佳答案

为什么不简单地在 xaml 中完成整个事情并且不使用“计算属性”?

<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}'s birthday is {1:ddd}">
<Binding Path="Person.Name">
<Binding Path="Person.BirthDay">
</MultiBinding>
</TextBlock.Text>
</TextBlock>

然后您需要做的就是在 Person 类中实现 INotifyPropertyChanged 并在 setter 中引发事件。

编辑:我还建议使用类似 MVVM light 的框架因此您可以为您的对象使用 ViewModelObservableObject 基类,并且能够简单地使用它们对 INotifyPropertyChanged

的实现
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
RaisePropertyChanged(() => FirstName);
}
}
private string _firstName;

关于c# - MVVM - 如何使格式化属性保持最新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21963372/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com