gpt4 book ai didi

WPF MVVM - 如何订阅绑定(bind)到网格行的模型实例的 PropertyChanged?

转载 作者:行者123 更新时间:2023-12-03 10:17:31 25 4
gpt4 key购买 nike

我的问题与 MVVM in WPF - How to alert ViewModel of changes in Model... or should I? 之类的问题非常相似和 ViewModel subscribing to Model's PropertyChanged event for a specific property .但是,有区别。

背景资料

我的模型是 Employee,我感兴趣的属性是 DisplayLtdOccupationId。

但在我的 ViewModel 中,我不仅有一个 Employee 实例。相反,我有一个 Employee 对象的集合。

 ObservableCollection<Employee> EmployeeCensus

在我看来,我有一个绑定(bind)到 EmployeeCensus 的 DataGrid。所以我在网格中有员工行。

问题

我想要的是能够响应 DisplayLtdOccupationId 的值已更改的特定 Employee 行的 PropertyChanged。我想在我的 ViewModel 中使用处理程序方法来做到这一点。

在我的处理程序中,我希望刚刚更改的 Employee 对象将位于“sender”变量中。然后我会获取它的 DisplayLtdOccupationId,从 ViewModel 内存中已有的集合中进行查找,并在同一个 Employee 对象的不同属性中设置查找值。

更多详情

ViewModel 和 Employee Model 都实现了 INotifyPropertyChanged(通过:Microsoft.Practices.Prism.ViewModel.NotificationObject)。

DataGrid 将 DisplayLtdOccupationId 属性显示为内联下拉列表,用户可以在其中选择不同的值。

为什么不在 Employee 模型中,在 DisplayLtdOccupationId 的 Setter 中这样做呢?因为我无权访问那里的查找集合。

我不想在 View 中使用触发器来启动处理程序。这导致了一个问题,这就是为什么我想探索仅使用 ViewModel 和 Model 的解决方案。

还有更多我可以补充的,但我试图让问题保持简短和重点。如果需要更多信息,请告知。

最佳答案

像这样的东西。我想你希望得到一些更聪明、更简洁的东西,但这就是你得到的。 Employee_PropertyChanged处理对 Employee 的属性的更改.你也可以给你的Employee将在其 DisplayLtdOccupationId 更改时引发的特定事件分类属性(property)。然后您的父 View 模型将处理该事件而不是 PropertyChanged .无论哪种方式都有效。

public class ViewModel : ViewModelBase
{
public ViewModel()
{
EmployeeCensus = new ObservableCollection<Employee>();
}

#region EmployeeCensus Property
private ObservableCollection<Employee> _employeeCensus = null;
public ObservableCollection<Employee> EmployeeCensus
{
get { return _employeeCensus; }
// Protect this so we don't have to handle the case of somebody giving us
// a whole new collection of new Employees.
protected set
{
if (value != _employeeCensus)
{
if (_employeeCensus != null)
{
_employeeCensus.CollectionChanged -= _employeeCensus_CollectionChanged;
}

_employeeCensus = value;
OnPropertyChanged(nameof(EmployeeCensus));

if (_employeeCensus != null)
{
_employeeCensus.CollectionChanged += _employeeCensus_CollectionChanged;
}
}
}
}

private void _employeeCensus_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.OldItems != null)
{
foreach (var item in e.OldItems.Cast<Employee>())
{
item.PropertyChanged -= Employee_PropertyChanged;
}
}
if (e.NewItems != null)
{
foreach (var item in e.NewItems.Cast<Employee>())
{
item.PropertyChanged += Employee_PropertyChanged;
}
}
}

private void Employee_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case nameof(Employee.DisplayLtdOccupationId):
// Do stuff
break;
}
}
#endregion EmployeeCensus Property
}

关于WPF MVVM - 如何订阅绑定(bind)到网格行的模型实例的 PropertyChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40386895/

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