2012-03-30 4 views
1

Я хочу показать иконки myElement.ContextMenu в отдельной панели. Я пытаюсь сделать это:Как связать элементы с ItemsSource?

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

Но он показывает мне коллекцию MenuItems вместо изображений. Как я могу сделать это без каких-либо ViewModels и манипуляций в файле xxx.xaml.cs.

+1

предоставить XAML для myElement (что такое ContextMenu.ItemsSource) – surfen

+0

ContextMenu - это контекстное меню любого элемента FrameworkElement. У него нет специального кода. Просто коллекция MenuItems. – Rover

+0

Что произойдет, если вы опустите свойство DataType? – surfen

ответ

1

Вы связываясь с ContextMenu.ItemsSource, который является другим свойством, чем ContextMenu.Items

ItemsSource будет установлен только если вы установите его на что-то, например, как совокупность объектов, и если это так, то ваш ItemsControl будет также быть привязаны к одному и тому же набору объектов. Если список объектов, используемых в вашем ItemsSource, не имеет свойства, называемого Icon, ваш код не будет работать.

Если вы пытаетесь привязать к ContextMenu.Items, вы получите набор MenuItem объектов, однако объекты пользовательского интерфейса могут иметь только одного родителя в то время, так что ваш MenuItems может существовать только в любом вашем ContextMenu или ваши ItemsControl, а не и то и другое.

Возможна одна из возможных возможностей: привязка с помощью конвертера, который будет принимать объекты внутри вашего ContextMenu и сделать копию свойства Icon и вернуть коллекцию изображений для отображения. Следует отметить, что это не сработает до тех пор, пока ваш ContextMenu не будет открыт впервые, потому что MenuItems фактически не отображаются до тех пор, пока это не понадобится.

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

где MyConverter принимает объект, переданный ему, получает объект, ContextMenu, петель через каждый MenuItem в ContextMenu.Items, сохраняет копию Icon собственности в List<T>, затем возвращает список.

Смежные вопросы