C# - 可以检测何时使用数据绑定

本文关键字:何时使 数据绑定 检测 | 更新日期: 2023-09-27 18:35:14

我想仅在对象被绑定时缓存一些特定于 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

C# - 可以检测何时使用数据绑定

您可以在属性 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();
  }
}