使用List<UIElement>作为ItemsControl的ItemsSource会导致DataTemplate不被应用。

5
我创建了一个自定义面板(MyCustomControl),它可以包含其他控件,并通过依赖属性进行配置。在另一个用户控件(MyUserControl)中,我在XAML中配置了多个MyCustomControl的实例。
在用户控件之外,我试图将ItemsControl(myItemsControl)绑定到运行时存在于MyUserControl中的MyCustomControls列表。因此,我通过依赖属性公开了来自MyUserControl的列表。
我从这种策略中遇到了意外的行为。我希望ItemsControl将列表中的每个控件实例作为具有数据值的对象使用,以填充ItemsControl的DataTemplate。但是,它并没有这样做。相反,它基本上忽略了DataTemplate,只是重新呈现列表/ItemsSource中的所有控件。
总之,如果我将控件列表用作ItemsControl的ItemsSource,则它不会将它们用作数据对象,而是将它们呈现为控件实例。
令人惊讶的是,如果我尝试做同样的事情,但使用ListBox而不是ItemsControl,则数据绑定按预期工作。我不想出于其他原因使用ListBox。有人知道影响此行为的ListBox和ItemsControl之间的区别是什么吗?

编辑:我发现另一个用户也遇到了同样的问题,但没有列出解决方案,这里是msdn社交论坛帖子


请参考这个问题的答案:https://dev59.com/6kbRa4cB1Zd3GeqP4-6u - Arcturus
1个回答

6
使用 Reflector 检查 ItemsControl 代码后,如果该项为 UIElement,则 IsItemItsOwnContainerOverride 方法返回 true。您可以创建 ItemsControl 的子类,并更改此方法如下:
protected override bool IsItemItsOwnContainerOverride(object item)
{
    return (item is ContentPresenter);
}

如果您使用该类来代替ItemsControl,则它将按预期工作,但不会具有ListBox的不需要的功能。

非常感谢,这个方法可行!我确实需要稍微修改一下方法的定义...protected override bool IsItemItsOwnContainerOverride(object item) - YeahStu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接