2016-07-21 5 views
1

На обычая ContentView я создал BindableProperty как этотBindableProperty уведомит свойство изменено

public static readonly BindableProperty StrokeColorProperty = 
    BindableProperty.Create("StrokeColor", 
          typeof(Color), 
          typeof(SignaturePadView), 
          Color.Black, 
          BindingMode.TwoWay); 

Но я должен уведомить об изменении свойства, как я должен прочитать свойство в пользовательском видеообработки, как я могу сделать это?
Если установить его на PropertyChanged для BindableProperty это статический метод, поэтому я не могу взять его с этого пути :(

ответ

4

обработчик события PropertyChanged для BindableProperty действительно будет статичной, а входные параметры на нем

BindingPropertyChangedDelegate<in TPropertyType>(BindableObject bindable, TPropertyType oldValue, TPropertyType newValue); 

так, как вы можете видеть, первый входной параметр будет BindableObject. вы можете safel y cast bindable в ваш пользовательский класс и получить свойство экземпляра who's. например:

public static readonly BindableProperty StrokeColorProperty = 
    BindableProperty.Create("StrokeColor", 
          typeof(Color), 
          typeof(SignaturePadView), 
          Color.Black, 
          BindingMode.TwoWay, 
propertyChanged: (b, o, n) => 
       { 
        var spv = (SignaturePadView)b; 
        //do something with spv 
        //o is the old value of the property 
        //n is the new value 
       }); 

Это показывает правильный способ уловить изменение свойства в общем коде, где свойство декалировано. Если у вас есть собственный рендерер в собственном проекте, это событие OnElementPropertyChanged будет пожара с «StrokeColor» как PropertyName, с или без этого свойства. Переданный делегат предоставляется в определение BindableProperty.

+0

Так что я должен сделать это так: var spv = bindable как SignaturePadView; SPV? .OnPropertyChanged ("StrokeColor") '. Почему это не называется автоматически? –

+0

Как бы событие изменения свойства когда-либо срабатывало, если не было экземпляра свойства SignaturePadView, которое было изменено? Прямой бросок должен быть совершенно безопасным и ясным в намерениях. – irreal

+0

Вы правы;) Но хотя я называю это так, 'OnElementPropertyChanged' не вызывается с этим именем параметра. О, я понял это; Renderer сначала изменяется после «BindableProperties» –

0

OnElementPropertyChanged Override метод на вашем видеообработки:

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 

     if(e.PropertyName=="StrokeColor") 
      DoSomething(); 
    } 
+0

Его никогда не вызывают с помощью этого 'PropertyName' –

+0

Как мне получить старое значение? – rraallvv

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