Я работаю с пользовательским 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();
}
}
Я предполагаю, что один простой ответ может быть следующим: , когда поведение привязано, просто проверьте, имеет ли свойство уже значение (может отличаться от значения по умолчанию) и в этом случае должно делать то, что должен был сделать PropertyChangedCallback. – superjos