我在 WPF 中有一个使用 MVVM 模式的项目。
该视图有一个 Persons(FirstName, LastName, Town) 的列表视图,列表旁边是人员的详细信息 (FirstName,LastName,ZIP),带有一个按钮 (Save)。如果您点击左侧的某个人,右侧的人员详细信息将自动加载。
在 ViewModel 中,我有一个 ObservableCollection 的 Person-Models。(人员名单)
Person 模型包括一些属性,例如 FirstName、LastName、Town、Zip。(细节)。
当我更改 ZIP 时,Town 将自动更新(在设置器开关情况下),例如 ZIP '11111' Town 'Town1' / ZIP '22222' Town 'Town2'。
Person 模型还包括一个用于保存更改的 ICommand“SavePerson”。
现在,当我单击列表视图中的某个项目时,详细信息将自动加载。当我更改名字或姓氏并单击“保存”时,列表视图将更改所选项目的名字和姓氏,没关系。现在,当我将 ZIP 从“12345”更改为“11111”时,列表视图中的城镇仍然是旧的,而不是“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];
}
}
视图模型:
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; }
}
}