2011-07-29 29 views
10

在我的應用程序(這與非常動態的導航和內容呈現做)我在XAML來使用此結構:WPF中的數據綁定現象(綁定到FrameworkElement) - 任何想法爲什麼?

<ContentControl Content={Binding ContentElement} /> 

到目前爲止,一切都很好。這很棒,絕對很棒。我可以在任何地方託管任意東西。

但似乎是一個奇怪的,好了,讓我們稱之爲它在WPF「現象」(我相信這是在BindingMarkupExtension,但目前還不能確定):

當我的ContentElement的屬性看起來是這樣的:

public FrameworkElement ContentElement 
{ 
    get 
    { 
     return this.m_ContentElement; 
    } 
} 

然後,每次數據綁定操作(包括用戶在動態更改語言或重新加載主機控制時)都會調用get(TWICE(!!!))。

但是(這是什麼是真正超乎想象對我來說):

當我改變我的ContentElement的屬性:

public object ContentElement 
{ 
    get 
    { 
     return this.m_ContentElement; 
    } 
} 

然後吸氣劑被調用一次。說真的,我不是在這裏躺着。在最簡單的應用程序中它是完全可重複的,您可以嘗試通過返回一個新的「TextBlock」(這就是我通常用來測試或瞭解更多高級WPF概念的方法)。

任何想法爲什麼?

我之所以這麼問,是我最討厭的解決方案的以下後果:

  • 我失去的類型安全在這一點上
  • 這可能是有點難以對新開發或過度懷疑的解釋wisecracks
+0

我不能在這裏重現這裏。在任何一種情況下,獲取者都會被調用一次。 –

+1

可能與您定位的框架版本有關。它是3.0,3.5還是4? – Will

+0

是的,我忘了測試。它不在3.5,但是在4.0。 – StormianRootSolver

回答

4

我能夠重現它的.NET 4.0,但它不是可重現的相同的應用程序,當您在項目的偏好設置.NET 3.5框架。在.NET 4.0的情況下 - 如果類型爲FrameworkElement,則有2個調用getter的調用。但內部堆棧不同。所以這絕對是因爲WPF 4.0的一些內部特性。而且......很難弄清楚爲什麼以及如何以這種方式工作。如果時間允許有人可以調查WPF內部與反射,但我相信這是雪球在地獄:)

0

機會,我有同樣的問題,並在另一個論壇上找到了答案從微軟: http://connect.microsoft.com/VisualStudio/feedback/details/554237/problem-binding-image-property-called-twice-for-each-item

正如Kreol說,它有趣的是,這是在.NET 4.0中完成的。

我不知道該怎麼想。這當然是有目的完成的,以改善表演或其他。

在我們的例子中,我們有我們的回報模型的視圖的屬性,這種觀點將顯示在屏幕型動物,所以我們不能用

如果實行單場(_localValue != NULL)

語句,必須創建一個新的控制每次的屬性getted。 所以這可能不再那麼高效了。

還有其他想法嗎?