【问题标题】:PropertyChangedCallback fired before WPF attached behavior gets attached在附加 WPF 附加行为之前触发 PropertyChangedCallback
【发布时间】:2015-02-26 10:02:39
【问题描述】:

我正在使用自定义 WPF 行为(来自 System.Windows.Interactivity 的行为)显示几个依赖项属性,其中一个是字符串。该行为还覆盖了OnAttached,以获取对其AssociatedObject UI 控件的引用。

当该附加属性数据绑定到 viewModel 并且稍后在某个时候更改(并通知)时,一切似乎都很好:OnAttached 已“一开始”被触发,后来 PropertyChangedCallback 被解雇。

我看到的问题是该属性未绑定,而是在 XAML 中设置为“静态”值。在这种情况下,PropertyChangedCallbackOnAttached 之前被触发,此时行为尚未知道其关联的 UI 控件并且基本上无法对属性更改做出任何反应。

我想我错过了在这种情况下应该如何做的事情。感谢您对理解这一点的任何帮助。助教

编辑
在这里显示一些代码,如果在这种情况下可能会有所帮助:

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 应该做的事情。

标签: wpf xaml attached-properties attachedbehaviors


【解决方案1】:

根据评论,一个简单的答案可能是:

当行为被附加时,只需检查属性是否已经有一个值(可能与默认值不同),在这种情况下执行PropertyChangedCallback 应该做的事情。

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2017-05-15
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多