2015-02-26 3 views
0

Я работаю с пользовательским WPF-поведением (тем, что из System.Windows.Interactivity) показывает пару свойств зависимостей, одна из которых является строкой. Поведение также переопределяет OnAttached, чтобы получить ссылку на его управление AssociatedObject.СвойствоChangedCallback, активированное до прикрепленного поведения WPF, привязано

Когда что придает свойство с привязкой к данным в ViewModel и позже изменено (уведомление) в какой-то момент, кажется, все в порядке: OnAttached был уволен «в начале», а позже PropertyChangedCallback увольняют ,

Проблема, которую я вижу, это когда свойство не связано, но установлено в «статическое» значение в XAML. В этом случае PropertyChangedCallback увольняется до OnAttached, когда поведение еще не знает связанный с ним контроль пользовательского интерфейса и в основном ничего не может сделать в ответ на изменение этого свойства.

Я думаю, что я что-то упустил, как все должно быть сделано в этом случае. Любая помощь в понимании этого приветствуется. TA

EDIT
Показаны здесь код, если это может быть полезным в этом случае:

public class SomeUIControlBehaviour : Behavior<SomeUIControl> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     _attachedUIControl = this.AssociatedObject; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     _attachedUIControl = null; 
    } 

    private SomeUIControl _attachedUIControl; 

    private void MessageChanged() 
    { 
     if (_attachedUIControl != null) 
     { 
      // do something on it 
     } 
     else 
     { 
      // bummer! 
     } 
    } 

    // Text property + dependency property 

    public string Message 
    { 
     get { return (string)GetValue(MessageProperty); } 
     set { SetValue(MessageProperty, value); } 
    } 

    private static string _defaultMessage = String.Empty; 

    // Using a DependencyProperty as the backing store for Message. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty MessageProperty = 
     DependencyProperty.Register("Message", 
      typeof(string), typeof(SomeUIControlBehaviour), 
      new PropertyMetadata(_defaultMessage, MessagePropertyChanged)); 

    private static void MessagePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs evt) 
    { 
     //Debug.WriteLine("MessagePropertyChanged, on " + sender.GetType().Name + ", to value " + evt.NewValue); 

     SomeUIControlBehaviour behaviour = sender as SomeUIControlBehaviour; 

     if (behaviour == null) 
     { 
      Debug.Fail("Message property should be used only with SomeUIControlBehaviour"); 
      return; 
     } 

     behaviour.MessageChanged(); 
    } 
} 
+1

Я предполагаю, что один простой ответ может быть следующим: , когда поведение привязано, просто проверьте, имеет ли свойство уже значение (может отличаться от значения по умолчанию) и в этом случае должно делать то, что должен был сделать PropertyChangedCallback. – superjos

ответ

0

Согласно комментарию, один простой ответ может быть:

когда поведение привязывается, просто проверьте, имеет ли свойство уже значение (может отличаться от значения по умолчанию), и в этом случае делать то, что должно было делать PropertyChangedCallback.

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