簡體   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