私は、いくつかの依存関係プロパティを示すカスタム WPF 動作 (System.Windows.Interactivity のもの) を使用しています。そのうちの 1 つは文字列です。UI コントロールOnAttached
への参照を取得するために、動作もオーバーライドします。AssociatedObject
その添付プロパティが viewModel にデータ バインドされ、後である時点で変更 (および通知) されると、すべて問題ないように見えます。OnAttached は「最初に」起動され、後でPropertyChangedCallbackが起動されます。
私が見る問題は、プロパティがバインドされていないが、XAML で「静的」値に設定されている場合です。この場合、PropertyChangedCallbackはOnAttachedの前に起動されます。これは、ビヘイビアが関連する UI コントロールをまだ認識しておらず、基本的にそのプロパティの変更に反応して何もできない場合です。
この場合、物事をどのように行うべきかについて何かが欠けていると思います。これを理解するための助けをいただければ幸いです。TA
編集
この場合に役立つ場合は、ここにいくつかのコードを表示します。
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();
}
}