WPF ItemsControl绑定到UserControls

时间:2019-05-22 12:23:00

标签: c# wpf xaml binding

ItemsControl绑定到UserControl对象的集合可以正常工作。但是,我想应用其他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>

1 个答案:

答案 0 :(得分:1)

看看reference source,发现ItemsControl类的IsItemItsOwnContainerOverride方法具有以下实现:

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

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

所以问题的答案

  

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

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

您应该改为遵循ItemsControl类的基本思想,并将数据项对象的集合分配给ItemsSource属性。然后,根据数据模板选择DataType属性设置为不同数据项类型的适当UI控件。


或者您创建一个派生的ItemsControl来覆盖IsItemItsOwnContainerOverride方法:

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