2016-02-17 2 views
0

Я хотел бы кэшировать некоторые свойства, специфичные для пользовательского интерфейса, только тогда, когда объект является DataBound, если он привязан.C# - Можно ли обнаружить, когда DataBound?

Скажем, у меня есть

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); 
     } 
    } 
} 

Можно ли осуществить действие или событие, чтобы стрелять в то время объект DataBound?

event Action OnDataBound { ... } 

Так что я могу обнаружить, скажем, когда

MyString myStrObj = new MyString("text"); 
myStrObj.OnDataBound += CacheUIElements(); 
Do.OtherStuff(); 
otherObj.DataSource = myStrObj; //causes CacheUIElements() to fire 

ответ

1

Вы можете очень хорошо сделать это в свойстве сеттера и вызвать делегата.

В приведенном выше случае это будет для OtherObj.DataSource. Поскольку вы хотите, чтобы действие активировалось при настройке источника данных. Таким образом, это должно быть в настройке любого свойства, в котором вы хотите, чтобы действие запускалось.

class OtherClass 
{ 
    DataSource 
    { 
     get{return _dataSource} 
     set 
     { 
      _dataSource = value; 
      OnPropertyChanged("DataSource"); 
      OnDataBound(); 
     } 
    } 
} 

Если нет, предполагая OtherClass Реализует OnPropertyChanged и триггеры для DataSource, как это, если его рамочный элемент наверняка он будет осуществлять NotifyPropertyChanged для DataSource, потому что только тогда 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(); 
    } 
} 
+0

Нет, я уже могу запустить OnPropertyChanged, если значение изменено, я редактировал исходный вопрос с более подробной информацией. – TaterJuice

+0

Точно то, чего я пытаюсь избежать, если это возможно. Я хочу реализовать его в исходном классе, поэтому я могу использовать его с произвольными типами - или все, что реализует привязку данных. – TaterJuice

+0

Изменяет ли ваш первоначальный класс - свойство свойства «OtherClass»? и запускать PropertyChanged («DataSource») случайно? – CarbineCoder

Смежные вопросы