2011-07-27 41 views
1

我有一個帶有自己的上下文菜單的用戶控件,但是我需要添加其他項目到該菜單。數據綁定集合依賴屬性到用戶控件中的菜單

我採取的方法是有一個依賴屬性稱爲ContextMenuItems:

Public Shared ReadOnly ContextMenuItemsProperty As DependencyProperty = DependencyProperty.Register("ContextMenuItems", GetType(ObservableCollection(Of MenuItem)), GetType(SmartDataControl), New FrameworkPropertyMetadata(New ObservableCollection(Of MenuItem))) 
Public Property ContextMenuItems As ObservableCollection(Of MenuItem) 
    Get 
     Return GetValue(ContextMenuItemsProperty) 
    End Get 

    Set(ByVal value As ObservableCollection(Of MenuItem)) 
     SetValue(ContextMenuItemsProperty, value) 
    End Set 
End Property 

然後我用一個CompositeCollection的靜態菜單項,從控制與主機提供的名單相結合:

<CompositeCollection x:Key="MenuItemsCompositeCollection"> 
     <MenuItem Header="TEST" /> 
     <CollectionContainer Collection="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ContextMenuItems, Converter={StaticResource TestConverter}}" /> 
     <MenuItem Header="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=ContextMenuItems}" /> 
    </CompositeCollection> 

我看的時候綁定到該資源將

  • TEST
  • (集合)

第二個菜單項被綁定到集合,以證明我可以得到它。我有一個測試轉換器,我已經添加到菜單項,它在轉換器方法中斷,但是當我將轉換器添加到CollectionContainer時,它不會被調用。

最後,我得到在輸出窗口中出現以下錯誤:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=ContextMenuItems; DataItem=null; target element is 'CollectionContainer' (HashCode=41005040); target property is 'Collection' (type 'IEnumerable')

回答

2

你那「證據」不起作用,因爲比較的兩個對象顯然是不相等的。您不能在收集容器中使用RelativeSourceElementName綁定,因爲沒有滿足必要的條件,即沒有NameScope,並且由於CollectionContainer是一個沒有出現在可視化樹中的abtract對象,所以也沒有祖先可以通過它被發現。

如果你有機會到該用戶控件,你可以使用,無論在Binding.Sourcex:Reference到該用戶控件的名字,防止CompositeCollection應在UserControl.Resources被定義,然後用StaticResource引用的週期性dependecy錯誤。

例如

<UserControl Name="control"> 
    <UserControl.Resources> 
     <CompositeCollection x:Key="collection"> 
      <!-- ... --> 
      <CollectionContainer Collection="{Binding ContextMenuItems, Source={x:Reference control}, Converter=...}"/> 
     </CompositeCollection> 
    </UserControl.Resources> 
    <!-- ... --> 
     <MenuItem ItemsSource="{Binding Source={StaticResource collection}}"/> 
</UserControl> 
+0

這樣做很有意義。我知道我所證明的一切是在綁定表達中沒有錯別字,但是你的探索揭示了爲什麼它能在一個地方工作而不是另一個地方工作。你可以發佈一些XAML來展示我將如何使用Binding.Source和x:Reference(MS文檔不是很有幫助)。謝謝。 – Darren

+0

@Darren:添加了一個例子,並重寫了第一段,因爲我犯了一個錯誤,問題並不是真正的繼承對象(因爲MenuItem中的綁定仍然有效),而是CollectionContainer沒有出現在的VisualTree。一般來說,綁定的許多工作都相當模糊,例如,在某些情況下,你有一個[artifical inhertance context](http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx),這可能相當神奇... –

+0

完美 - 謝謝爲所有細節 – Darren

相關問題