gpt4 book ai didi

c# - 为嵌套(子)对象订阅 INotifyPropertyChanged

转载 作者:IT王子 更新时间:2023-10-29 04:16:35 26 4
gpt4 key购买 nike

我正在寻找一种干净且优雅 的解决方案来处理嵌套(子)对象的 INotifyPropertyChanged 事件。示例代码:

public class Person : INotifyPropertyChanged {

private string _firstName;
private int _age;
private Person _bestFriend;

public string FirstName {
get { return _firstName; }
set {
// Short implementation for simplicity reasons
_firstName = value;
RaisePropertyChanged("FirstName");
}
}

public int Age {
get { return _age; }
set {
// Short implementation for simplicity reasons
_age = value;
RaisePropertyChanged("Age");
}
}

public Person BestFriend {
get { return _bestFriend; }
set {
// - Unsubscribe from _bestFriend's INotifyPropertyChanged Event
// if not null

_bestFriend = value;
RaisePropertyChanged("BestFriend");

// - Subscribe to _bestFriend's INotifyPropertyChanged Event if not null
// - When _bestFriend's INotifyPropertyChanged Event is fired, i'd like
// to have the RaisePropertyChanged("BestFriend") method invoked
// - Also, I guess some kind of *weak* event handler is required
// if a Person instance i beeing destroyed
}
}

// **INotifyPropertyChanged implementation**
// Implementation of RaisePropertyChanged method

}

关注 BestFriend 属性及其值 setter 。现在我知道我可以手动执行此操作,执行评论中描述的所有步骤。但这将需要大量代码,尤其是当我计划让许多子属性像这样实现 INotifyPropertyChanged 时。当然它们不会总是相同的类型,它们唯一的共同点是 INotifyPropertyChanged 接口(interface)。

原因是,在我的真实场景中,我有一个复杂的“Item”(在购物车中)对象,它在多个层上嵌套了对象属性(Item 有一个“License”对象,它本身又可以有子对象) 并且我需要收到有关“项目”的任何单个更改的通知,以便能够重新计算价格。

你有什么好的建议,甚至一些实现帮我解决这个?

不幸的是,我不能/不允许使用像 PostSharp 这样的构建后步骤来实现我的目标。

最佳答案

因为我找不到现成的解决方案,所以我根据 Pieters(和 Marks)的建议(谢谢!)做了一个自定义实现。

使用这些类,您将收到有关深层对象树中任何更改的通知,这适用于任何 INotifyPropertyChanged 实现类型和 INotifyCollectionChanged* 实现集合(显然,我我正在为此使用 ObservableCollection)。

我希望这是一个非常干净和优雅的解决方案,虽然它没有经过全面测试,但仍有改进的空间。它非常易于使用,只需创建一个 ChangeListener 的实例,使用它的静态 Create 方法并传递您的 INotifyPropertyChanged:

var listener = ChangeListener.Create(myViewModel);
listener.PropertyChanged +=
new PropertyChangedEventHandler(listener_PropertyChanged);

PropertyChangedEventArgs 提供一个 PropertyName,它将始终是您的对象的完整“路径”。例如,如果您更改 Persons 的“BestFriend”名称,则 PropertyName 将为“BestFriend.Name”,如果 BestFriend 有一个 Children 集合并且您更改了它的年龄, 值将是 "BestFriend.Children[].Age"等等。当您的对象被销毁时,不要忘记 Dispose,然后它将(希望)完全取消订阅所有事件监听器。

它在 .NET(在 4 中测试)和 Silverlight(在 4 中测试)中编译。因为代码分为三个类,所以我已将代码发布到 gist 705450 在这里你可以捕获一切:https://gist.github.com/705450 **

*) 代码工作的一个原因是 ObservableCollection 还实现了 INotifyPropertyChanged,否则它不会按预期工作,这是一个已知的警告

**) 免费使用,在 MIT License 下发布

关于c# - 为嵌套(子)对象订阅 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143179/

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