我有:
public class Vm
{
private ObservableCollection<Thing> _things;
public ObservableCollection<Thing> Things
{
get { return _things ?? (_things = new ObservableCollection<Thing>()); }
}
}
和
public class Thing :INotifyPropertyChanged
{
private string _value;
public string Value
{
get { return _value; }
set
{
if (value == _value) return;
_value = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
我想观察ObservableCollection
中所有项目的PropertyChangesrx是否适合这个?
在这种情况下,观察者如何接线? (我可以发布一些你尝试过的东西,但我认为它不会增加太多)
答案 0 :(得分:2)
Rx非常合适,我不会称之为重新发明轮子!
考虑这个简单的扩展方法,用于将属性更改事件转换为可观察流:
public static class NotifyPropertyChangedExtensions
{
public static IObservable<PropertyChangedEventArgs> WhenPropertyChanged(this NotifyPropertyChanged notifyPropertyChanged)
{
return Observable.FromEvent<PropertyChangedEventHandler, PropertyChangedEventArgs>(
ev => notifyPropertyChanged.PropertyChanged += ev,
ev => notifyPropertyChanged.PropertyChanged -= ev);
}
}
在您的视图模型中,您只需合并所有单个可观察的属性更改流:
public class VM
{
readonly SerialDisposable subscription;
public VM()
{
subscription = new SerialDisposable();
Things = new ObservableCollection<Thing>();
Things.CollectionChanged += ThingsCollectionChanged;
}
void ThingsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
subscription.Disposable =
Things.Select(t => t.WhenPropertyChanged())
.Merge()
.Subscribe(OnThingPropertyChanged);
}
void OnThingPropertyChanged(PropertyChangedEventArgs obj)
{
//ToDo!
}
public ObservableCollection<Thing> Things { get; private set; }
}