【问题标题】:How to bind Items to ItemsSource?如何将项目绑定到 ItemsSource?
【发布时间】:2012-03-30 14:03:07
【问题描述】:

我想在单独的面板中显示 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 而不是图像的集合。如果没有任何 ViewModel 和 xxx.xaml.cs 文件中的操作,我该如何做到这一点。

【问题讨论】:

  • 为 myElement 提供 XAML(什么是 ContextMenu.ItemsSource)
  • ContextMenu 是任何 FrameworkElement 的上下文菜单。它没有任何特殊代码。只是 MenuItems 的集合。
  • 如果省略 DataType 属性会怎样?
  • 如果您在 XAML 中设置 MenuItems,那么 ItemsSource 将为空,不是吗?也许你应该写 Path=ContextMenu.Items
  • 如果将数据模板中的Image 控件替换为ContentControlContent={Binding Icon},会发生什么情况?

标签: c# .net wpf binding


【解决方案1】:

您正在绑定到ContextMenu.ItemsSource,这是与ContextMenu.Items 不同的属性

ItemsSource 仅在您将其设置为某些东西(例如对象集合)时才会设置,如果是这种情况,那么您的 ItemsControl 也将绑定到相同的对象集合。除非ItemsSource 中使用的对象列表绑定了一个名为Icon 的属性,否则您的代码将无法工作。

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

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

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

其中MyConverter 获取传递给它的对象,获取对象的ContextMenu,循环遍历ContextMenu.Items 中的每个MenuItem,将Icon 属性的副本存储在List&lt;T&gt; 中,然后返回列表。

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2017-09-18
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多