我有一個帶有自己的上下文菜單的用戶控件,但是我需要添加其他項目到該菜單。數據綁定集合依賴屬性到用戶控件中的菜單
我採取的方法是有一個依賴屬性稱爲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')
這樣做很有意義。我知道我所證明的一切是在綁定表達中沒有錯別字,但是你的探索揭示了爲什麼它能在一個地方工作而不是另一個地方工作。你可以發佈一些XAML來展示我將如何使用Binding.Source和x:Reference(MS文檔不是很有幫助)。謝謝。 – Darren
@Darren:添加了一個例子,並重寫了第一段,因爲我犯了一個錯誤,問題並不是真正的繼承對象(因爲MenuItem中的綁定仍然有效),而是CollectionContainer沒有出現在的VisualTree。一般來說,綁定的許多工作都相當模糊,例如,在某些情況下,你有一個[artifical inhertance context](http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx),這可能相當神奇... –
完美 - 謝謝爲所有細節 – Darren