gpt4 book ai didi

c# - 从 SortedList 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable

转载 作者:太空狗 更新时间:2023-10-29 20:13:41 26 4
gpt4 key购买 nike

我有一个类(class),MyClass实现 INotifyPropertyChanged并具有一些实现 PropertyChanged 的属性.当MyClass.MyProperty变化,PropertyChanged按预期开火。另一个类包含一个 SortedList<MyClass> .我尝试将事件合并到包含 SortedSet<MyClass> 的类中的单个可观察对象中并订阅它,但它似乎没有任何事件。这是我正在尝试的:

Observable.Merge(MySortedList.ToObservable())
.Subscribe(evt => Console.WriteLine("{0} changed", evt.MyProperty));

我想要得到的是一个单独的可观察对象,它包含我的 SortedList<MyClass> 中每个项目的所有事件。 .我试过使用 ObservableCollection 代替,但这不会改变任何东西,也不会期望它真的改变,因为无论如何,当包含的项目的属性发生变化时它不会触发 collectionchanged。我可以听到 SortedList<MyClass> 中的单个元素并看到 PropertyChanged 事件触发,但我想要的是单个 Observable,它包含来自 SortedList<MyClass> 中所有元素的所有 PropertyChanged 事件流。 .

看起来这应该是使用 Rx 很容易做到的事情,但我似乎无法弄清楚如何去做。

最佳答案

我已经为 RxCookBook 写了一篇关于这个主题的文章,你可以在这里找到 https://github.com/LeeCampbell/RxCookbook/blob/master/Model/CollectionChange.md更多关于 PropertyChange 通知的文章在这里 https://github.com/LeeCampbell/RxCookbook/blob/master/Model/PropertyChange.md

它通过汇总来自 ObservableCollection<T> 的更改来解决您的需求.通过使用 ObservableCollection<T>当集合中添加或删除项目时,您还会收到通知。

如果您不想使用 ObservableCollection<T> (即您只想跟踪集合的给定快照的属性)那么您将需要做其他事情。首先我假设你有一个 INoftifyPropertyChangedIObservable<T>扩展方法,或者您将使用标准事件来 IObservable<T>方法。

接下来,您可以将值列表投影到更改序列列表中,即 IEnumerable<T>IEumerable<IObserable<T>> .这允许您使用 Observable.Merge将更改列表展平为单个更改流

如果您不想使用上面的链接,这里有一个示例:

void Main()
{
var myList = new List<MyThing>{
new MyThing{Name="Lee", Age=31},
new MyThing{Name="Dave", Age=37},
new MyThing{Name="Erik", Age=44},
new MyThing{Name="Bart", Age=24},
new MyThing{Name="James", Age=32},
};

var subscription = Observable.Merge(myList.Select(t=>t.OnAnyPropertyChanges()))
.Subscribe(x=>Console.WriteLine("{0} is {1}", x.Name, x.Age));

myList[0].Age = 33;
myList[3].Name = "Bob";

subscription.Dispose();
}

// Define other methods and classes here
public class MyThing : INotifyPropertyChanged
{
private string _name;
private int _age;

public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}

public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged("Age");
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}

public static class NotificationExtensions
{
/// <summary>
/// Returns an observable sequence of the source any time the <c>PropertyChanged</c> event is raised.
/// </summary>
/// <typeparam name="T">The type of the source object. Type must implement <seealso cref="INotifyPropertyChanged"/>.</typeparam>
/// <param name="source">The object to observe property changes on.</param>
/// <returns>Returns an observable sequence of the value of the source when ever the <c>PropertyChanged</c> event is raised.</returns>
public static IObservable<T> OnAnyPropertyChanges<T>(this T source)
where T : INotifyPropertyChanged
{
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Select(_=>source);
}
}

输出:

Lee is 33
Bob is 24

关于c# - 从 SortedList<MyClass> 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750718/

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