2010-07-05 45 views
19

我有一個ItemsControl顯示一堆矩形。每個矩形需要向上和向左偏移。所以,我創建了一個RectangleStyle,它使用綁定爲矩形設置寬度,高度,X平移和Y平移。WPF風格的綁定導致莫名其妙的「無法找到治理FrameworkElement」錯誤

寬度和高度綁定工作正常,但我得到了TranslateTransform綁定以下錯誤:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Offset.X; DataItem=null; target element is 'TranslateTransform' (HashCode=16452547); target property is 'X' (type 'Double')

這裏是我的ItemControl的定義:

<ItemsControl 
    Style="{StaticResource ItemsControlStyle}" 
    ItemsSource="{Binding Zones}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Style="{StaticResource RectangleStyle}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

這裏ItemsControlStyle的定義:

<Style x:Key="ItemsControlStyle" TargetType="ItemsControl"> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <Canvas /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style> 
       <Setter Property="Canvas.Left" Value="{Binding Point.X}" /> 
       <Setter Property="Canvas.Top" Value="{Binding Point.Y}" /> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

這裏是RectangleStyle定義:

<Style x:Key="RectangleStyle" TargetType="Rectangle"> 
    <Setter Property="Width" Value="{Binding Size.Width}" /> 
    <Setter Property="Height" Value="{Binding Size.Height}" /> 
    <Setter Property="RenderTransform"> 
     <Setter.Value> 
      <!-- these bindings are causing the error --> 
      <TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" /> 
     </Setter.Value> 
    </Setter> 
</Style> 

RenderTransform二傳手RectangleStyle兩個綁定在錯誤的原因,但我不知道該怎麼做來解決這個問題。有趣的是,圖形正確轉換,所以WPF能夠解析綁定 - 由於某種原因,它們並不滿意。

我能做些什麼來解決綁定問題?


編輯

我提交了一份關於MS連接一個bug報告:

https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window

+0

好吧,它很容易複製。我嘗試了大約10種不同的東西,但綁定工作正常,我還想知道你是否應該在MS Connect上登錄這個,並讓他們想知道它是否是一個錯誤。 – 2010-07-06 23:03:39

+0

看起來bug報告鏈接已更改或不再公開。想知道這個解決方案,因爲添加x:Name對我沒有任何幫助。 – 2015-09-28 18:15:38

回答

41

我也無法解釋爲什麼錯誤消息發生,但我發現,添加一個X:Name屬性的轉換是擺脫錯誤信息的方式:

<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" /> 
+0

當我在Control Template Trigger中使用GradientStops時,我遇到了同樣的問題。給一個x:Name不適合我。這個Bug非常令人沮喪,因爲我有一個Control的大約20個GradientStops,而在View中我使用了這個Control 30 Times。現在,您可以通過調試打開視圖需要多長時間... – Bulli 2013-06-12 06:15:34

+4

我遇到了同樣的問題。地獄裏有什麼x:綁定的名字? – Enyra 2013-08-23 09:04:47

+1

很好的解決方法;那些虛假的錯誤讓我很煩惱。考慮到自從原來的帖子以來有多少年了,我猜這是決定不值得修復的。 – 2014-05-09 14:53:22

9

我想我發現了一些有用的信息。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c01831687683

這個問題的答案似乎是在行爲的微軟解釋一個ItemsControl經過其合成工藝及應用綁定和樣式。也就是說,WPF正在嘗試優化DataTemplate,然後它有一個數據源來成功評估綁定:「dataitem = null」。在其他佈局過程中的其他實例中,「dataitem」指向您的「區域」IEnumerable中的某些內容,並且可以完成綁定。否則,您會看到集合中每個項目的錯誤,而不是每個屬性的錯誤。

這似乎是「不理睬幕後的男人」類型的東西。它可能應該作爲錯誤報告添加到MS Connect中;成功的代碼不應該拋出無關緊要的「錯誤」。但是如果你願意的話,我會把它留給你,用MS Connect來提交。

+1

+1,我同意,並且我剛剛在MS Connect上提交了一個錯誤:https://connect.microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears在輸出窗口 – devuxer 2012-06-06 00:17:29

+3

哇。他們花了大約五分鐘的時間來決定「嘖嘖嘖嘖嘖嘖嘖嘖嘖嘖嘖嘖,但我們不會解決這個問題。」 – 2012-06-07 18:17:16

+1

讓我懷疑WPF是否已經退居二線了WinRT。 – devuxer 2012-06-07 18:19:25

1

閱讀羅布後珀金斯的回答,我添加了一個FallbackValue來解決這個問題。這爲我清除了錯誤。