如何将Items绑定到ItemsSource?

时间:2012-03-30 14:03:08

标签: c# .net wpf binding

我想在单独的面板中显示myElement.ContextMenu图标。 我正在尝试这样做:

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

但它显示了我收集的MenuItems而不是Images。如果没有xxx.xaml.cs文件中的任何ViewModel和操作,我怎么能这样做。

1 个答案:

答案 0 :(得分:1)

您绑定到的ContextMenu.ItemsSource属性与ContextMenu.Items

不同

ItemsSource只有在您将其设置为某些内容时才会设置,例如对象集合,如果是这种情况,那么您的ItemsControl也将绑定到同一个对象集合。除非ItemsSource中使用的对象列表绑定了具有名为Icon的属性,否则您的代码将无效。

如果您尝试绑定到ContextMenu.Items,您将获得MenuItem个对象的集合,但是UI对象一次只能有一个父对象,因此您的MenuItems只能存在于ContextMenuItemsControl,而不是两者。

执行所需操作的一个可能选项是使用Converter绑定,它将获取ContextMenu中的对象,并复制Icon属性,并返回图像集合显示。应该注意的是,在第一次打开ContextMenu之前,这不起作用,因为MenuItems在需要之前才会实际呈现。

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

其中MyConverter获取传递给它的对象,获取对象的ContextMenu,遍历MenuItem中的每个ContextMenu.Items,存储Icon的副本List<T>中的属性,然后返回列表。