2014-12-04 31 views
0

我設置在我的控制(在XAML)行爲,該行爲具有下面的代碼:WPF行爲的AssociatedObject爲空

protected override void OnAttached() 
{ 
    base.OnAttached(); 

    AssociatedObject.Loaded += OnMycontrolLoaded; 
    AssociatedObject.Unloaded += OnMycontrolUnloaded; 
} 

private void OnMycontrolLoaded(object sender, RoutedEventArgs e) 
{ 
    AssociatedObject.MyEvent +=MyEventHandler; 
} 

protected override void OnDetaching() 
{ 
    base.OnDetaching(); 

    AssociatedObject.Loaded -= OnMycontrolLoaded; 
    AssociatedObject.Unloaded -= OnMycontrolUnloaded; 
}  

當我創建的控制奇怪的事情幾種情況正在發生:調用OnMycontrolLoaded方法(即加載控件/ AssociatedObject),但在其內部AssociatedObject爲空。

爲什麼會發生?

+0

任何機會'OnDetached'之前被調用?該控件是在UI中呈現還是在代碼中引用? – 2014-12-04 09:36:24

+0

事件在OnDetaching中未註冊(請參閱編輯後),該控件顯示在UI中。 – 2014-12-04 10:47:17

+0

您可以添加創建行爲並附加它們的xaml /代碼嗎? – 2014-12-04 11:31:29

回答

1

你應該看看你的AssociatedObject被引用的地方。

public abstract class Behavior<T> : DependencyObject, IBehavior where T : DependencyObject { 

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public T AssociatedObject { get; set; } 

    protected virtual void OnAttached() { 
    } 

    protected virtual void OnDetaching() { 
    } 

    public void Attach(Windows.UI.Xaml.DependencyObject associatedObject) { 
     this.AssociatedObject = (T)associatedObject; 
     OnAttached(); 
    } 

    public void Detach() { 
     OnDetaching(); 
    } 

    DependencyObject IBehavior.AssociatedObject { 
     get { return this.AssociatedObject; } 
    } 
} 

看吧http://www.reflectionit.nl/Blog/2013/windows-8-xaml-tips-creating-blend-behaviors

+0

然後呢?這是如何回答null AssociatedObject的原始問題的? – AndyUK 2016-10-26 09:33:11

+0

它沒有。這種情況似乎發生在行爲的數據綁定屬性具有非空值*和*行爲在模板中使用時,並且在我看來這是一個錯誤。請參閱http://stackoverflow.com/questions/5541702/dependencyobject-associatedobject-is-always-null的解答以獲得兩種建議的解決方案。 – 2017-03-25 21:54:40