[英]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.