2012-03-30 15 views
1

Ich möchte myElement.ContextMenu Symbole in separaten Bereich anzeigen. Ich versuche, dies zu tun:Wie binden Sie Elemente an ItemsSource?

<ItemsControl ItemsSource="{Binding ElementName=myElement, Path=ContextMenu.ItemsSource}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type MenuItem}"> 
      <Image Source="{Binding Icon}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Aber es zeigt mir Sammlung von MenuItems statt Bilder. Wie kann ich es ohne ViewModels und Manipulationen in der Datei xxx.xaml.cs tun?

+1

Bereitstellung des XAML für myElement (was ist ContextMenu.ItemsSource) – surfen

+0

ContextMenu ist Kontextmenü von einem FrameworkElement. Es hat keinen speziellen Code. Nur Sammlung von MenuItems. – Rover

+0

Was passiert, wenn Sie die DataType-Eigenschaft weglassen? – surfen

Antwort

1

Du Bindung an ContextMenu.ItemsSource die eine andere Eigenschaft als ContextMenu.Items

ItemsSource wird nur dann gesetzt werden, wenn man es zu etwas, wie eine Sammlung von Objekten gesetzt, und wenn das der Fall ist, dann ItemsControl wird auch an die gleiche Sammlung von Objekten gebunden sein. Wenn die Liste der Objekte in Ihrer ItemsSource nicht gebunden ist, hat eine Eigenschaft namens Icon, Ihr Code wird nicht funktionieren.

Wenn Sie ContextMenu.Items zu binden versuchen, werden Sie eine Sammlung von MenuItem Objekten erhalten, jedoch Objekte UI können nur zu einem Zeitpunkt einen einzelnen Elternteil haben, so dass Ihre MenuItems nur entweder existieren kann in Ihrem ContextMenu oder Ihrem ItemsControl, und nicht beide.

Eine mögliche Option zu tun, was Sie wollen, ist die Bindung mit einem Konverter, der die Objekte innerhalb Ihrer ContextMenu nimmt, und eine Kopie der Icon -Eigenschaft, und eine Sammlung der Bilder zur Anzeige zurückgeben. Es sollte beachtet werden, dass dies nicht funktioniert, bis Ihre ContextMenu das erste Mal geöffnet wird, da die MenuItems nicht tatsächlich wiedergegeben werden, bis sie benötigt werden.

<ItemsControl ItemsSource="{Binding ElementName=MyObjectWithContextMenu, 
    Converter={StaticResource MyConverter}}" /> 

wo MyConverter die ihm übergebene Objekt nimmt, bekommt das Objekt der ContextMenu, Schleifen durch jede MenuItem in ContextMenu.Items, speichert eine Kopie der Icon Eigenschaft in einem List<T>, dann die Liste zurückgibt.

Verwandte Themen