gpt4 book ai didi

wpf - MVVM 刷新模型

转载 作者:行者123 更新时间:2023-12-03 10:59:37 26 4
gpt4 key购买 nike

我在 WPF 中有一个使用 MVVM 模式的项目。

该 View 有一个 Persons(FirstName, LastName, Town) 的 ListView ,列表旁边是人员的详细信息 (FirstName,LastName,ZIP),带有一个按钮 (Save)。
如果您点击左侧的某个人,右侧的人员详细信息将自动加载。

在 ViewModel 中,我有一个 ObservableCollection 的 Person-Models。 (人员名单)

Person 模型包括一些属性,例如 FirstName、LastName、Town、Zip。 (细节)。

当我更改 ZIP 时,Town 将自动更新(在 setter switch-case 中),例如 zip “11111”镇“镇1”/ zip “22222”镇“镇2”。

Person 模型还包括一个用于保存更改的 ICommand“SavePerson”。

现在,当我单击 ListView 中的某个项目时,详细信息将自动加载。
当我更改名字或姓氏并单击“保存”时, ListView 将更改所选项目的名字和姓氏,没关系。
现在,当我将 ZIP 从“12345”更改为“11111”时, ListView 中的城镇仍然是旧的,而不是“Town1”。

您是否有解决此问题的想法,而无需在模型中实现 INotifyPropertyChanged-Interface?

一些代码:
模型:

public class Person
{
private string _firstName = string.Empty;
private string _lastName = string.Empty;
private string _zip = string.Empty;
private string _town = string.Empty;

public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}

public string LastName
{
get { return _lastName; }
set { _lastName= value; }
}

public string ZIP
{
get { return _zip; }
set
{
switch (value)
{
case "11111":
this.Town = "Town1";
break;
case "22222":
this.Ort = "Town2";
break;
default:
break;
}
_zip = value;
}
}

public string Town
{
get { return _town; }
set { _town= value; }
}
public ICommand SaveNameCommand
{
get
{
return new DelegateCommand((param) => this.SaveName(param));
}
}

private void SaveName(object parameter)
{
string[] param = ((string)parameter).Split(new char[] { ':' });
FirstName = param[0];
LastName = param[1];
PLZ = param[2];
}
}

View 模型:
public class PersonList
{
private readonly ObservableCollection<Person> _persons = new ObservableCollection<Person>();
private Person _currentSelectedPerson = new Person();

public PersonList()
{
this._persons.Add(new Person() { FirstName = "First1", LastName = "Last1", Ort = "Ort1", PLZ = "112" });
this._persons.Add(new Person() { FirstName = "First2", LastName = "Last2", Ort = "Ort2", PLZ = "122" });
this._persons.Add(new Person() { FirstName = "First3", LastName = "Last3", Ort = "Ort3", PLZ = "1132" });
}

public IEnumerable<Person> Persons
{
get { return this._persons; }
}
}

最佳答案

由于您的模型应该与您的 View 模型松散耦合,因此您可能不想在模型中实现 INotifyPropertyChanged 是有道理的,因为它最常与 WPF 相关联;但是,它是一个 C# 接口(interface),可以在任何类型的应用程序中使用,因此实现它并没有什么坏处。事实上,我认为这可能是最好的方法。但是,如果您 真的不想在您的模型类中实现它,请考虑一个事件订阅者模型,其中模型在更改时引发一个事件,而 ViewModel 订阅它。

model.ValuesChanged += model_ValuesChanged;

private void model_ValuesChanged(object sender, EventArgs e)
{
RaisePropertyChanged("MyProperty");
}

关于wpf - MVVM 刷新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19701569/

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