繁体   English   中英

WPF ItemsControl绑定到UserControls

[英]WPF ItemsControl bound to UserControls

绑定到UserControl对象集合的ItemsControl正常工作。 但是,我想应用其他XAML,例如Border等。

但是,不是呈现UserControl的Border ,而是仅呈现UserControl本身。 <ItemsControl.ItemTemplate>似乎没有任何作用。

问题:如何设计带有附加XAML的ItemTemplate? 当前,该标签似乎被“忽略”。


ViewModel: ObservableCollection<UserControl> MyUserControls

<ItemsControl ItemsSource="{Binding MyUserControls, lementName=popupContainer}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border ...>
                <ContentControl Content="{Binding}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

查看参考源可以发现ItemsControl类的IsItemItsOwnContainerOverride方法具有以下实现:

protected virtual bool IsItemItsOwnContainerOverride(object item)
{
    return (item is UIElement);
}

因此,如果将UIElements的集合传递给ItemsControl的ItemsSource,则这些元素将直接用作项目容器,而无需在ContentPresenter进行通常的包装。 因此根本没有应用ItemTemplate

所以问题的答案

如何设计带有附加XAML的ItemTemplate?

是:如果ItemsSource是UIElements的集合,则完全没有。

相反,您应该遵循ItemsControl类的基本思想,并将数据项对象的集合分配给ItemsSource属性。 然后通过DataTemplates选择合适的UI控件,这些控件的DataType属性设置为不同数据项的类型。


或者,您创建派生的ItemsControl,它重写IsItemItsOwnContainerOverride方法:

public class MyItemsControl : ItemsControl
{
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM