我写了ObservableValue<T>
来为值类型实现INotifyPropertyChanged
,作为对.NET类ObservableCollection<T>
的补充。
class ObservableValue<T> : INotifyPropertyChanged {
private T value;
private PropertyChangedEventHandler eh;
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged {
add { eh += value; }
remove { eh -= value; }
}
public T Value {
get { return value; }
set {
this.value = value;
OnPropertyChanged();
}
}
void OnPropertyChanged() {
if (eh != null)
eh(this, new PropertyChangedEventArgs("Value"));
}
}
但是,要使用此类,必须绑定到ObservableValue<T>.Value
而不是ObservableValue<T>
。是否可以编写一些魔术代码以使ObservableValue<T>
能够在T
有效的任何环境中使用?
答案 0 :(得分:1)
不,不可能为任何上下文执行此操作:具体而言,无法将其设置为ObservableValue<T>
传递给ref
的方法或out
类型的T
参数。
但是,您可以通过从ObservableValue<T>
到T
定义隐式conversion operator,让用户将ObservableValue<T>
的实例传递给采用{{{ 1}}按值,或将T
分配给ObservableValue<T>
类型的变量,而不明确引用T
:
.Value
当然,在预期public static implicit operator T(ObservableValue<T> ot) {
return ot.Value;
}
的上下文中使用ObservableValue<T>
时,它会丢失其可观察行为:不会触发任何事件,并且原始T
对象不会修改。