我想仅在对象被绑定时缓存一些特定于 UI 的属性,如果它被绑定。
说我有
public interface IAmA<T> ()
{
T Value {get;set;}
}
public class MyString : IAmA<string>, INotifyPropertyChanged {
private string _value = String.Empty;
public virtual string Value
{
get
{
return this._value;
}
set
{
this._value = value;
OnPropertyChanged();
}
}
public virtual event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
}
是否可以实现在对象数据绑定时触发的操作或事件?
event Action OnDataBound { ... }
所以我可以检测,比如说,什么时候
MyString myStrObj = new MyString("text");
myStrObj.OnDataBound += CacheUIElements();
Do.OtherStuff();
otherObj.DataSource = myStrObj; //causes CacheUIElements() to fire
您可以在属性 setter 中很好地执行此操作并调用委托。
在上述情况下,它将用于 OtherObj.DataSource。因为您希望在设置数据源时触发操作。因此,它应该位于您希望触发操作的任何属性的 setter 中。
class OtherClass
{
DataSource
{
get{return _dataSource}
set
{
_dataSource = value;
OnPropertyChanged("DataSource");
OnDataBound();
}
}
}
如果没有,假设 OtherClass 实现 OnPropertyChanged 并像这样为数据源触发,如果它是一个框架元素,它肯定会为数据源实现 NotifyPropertyChanged 因为只有这样 UI 才会随着更改而刷新。
class OtherClass: INotifyPropertyChanged
{
DataSource
{
get{return _dataSource}
set
{
_dataSource = value;
OnPropertyChanged("DataSource");
}
}
}
然后,您可以订阅此事件并检查属性名称并触发 OnDataBound();例如:
otherClassObj.PropertyChanged += OtherClassPropertyChanged()
private void OtherClassPropertyChanged(Obj sender, PropertyChangedEventargs e)
{
if(e.PropertyName = "DataSource")
{
OnDataBound();
}
}