0

私は、いくつかの依存関係プロパティを示すカスタム 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();
    }
}
4

1 に答える 1

0

コメントによると、1つの簡単な答えは次のとおりです。

動作が追加されたら、プロパティに既に値が設定されているかどうか (デフォルトとは異なる可能性があります) を確認し、その場合PropertyChangedCallbackは本来の動作を実行します。

于 2015-03-11T18:29:33.547 に答える