将ItemsControl
绑定到ObservableCollection<T>
会在运行时在控件中放置一个额外的{NewItemPlaceholder}
。如何移除它?
N。B.我看到过与此问题相关的帖子,但这些帖子仅限于DataGrid
,您可以在其中设置CanUserAddRows
或IsReadOnly
属性以消除此项目。ItemsControl
不具有这样的性质。
XAML
这是我的ItemsControl
(MyPoints
是底层ViewModel中的ObservableCollection<T>
):
<ItemsControl ItemsSource="{Binding MyPoints}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="FrameworkElement">
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type vm:PointVM}">
<Ellipse Width="10" Height="10" Fill="#88FF2222" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这将在0,0处显示一个额外的点。Live Property Explorer显示此点已绑定到{NewItemPlaceholder}
对象。
当实现
IEditableCollectionView
的CollectionView
具有NewItemPlaceholderPosition
设置为AtBeginning
或AtEnd
CCD_ 17被添加到集合中。NewItemPlaceholder
总是出现在收藏中;它不参与分组,排序或过滤。
链接:MSDN
如果您将NewItemPlaceholderPosition
设置为其他值,则占位符将从集合中消失。
编辑:
如果您的ObservableCollection<T>
也绑定到其他地方(例如:绑定到DataGrid
,则必须将CanUserAddRows
设置为false),则必须处理其他项。它将为您的收藏添加一个新的NewItemPlaceholder
。
终于来了!
花了一天时间后,解决方案变得很简单(尽管并不理想)。ItemTemplateSelector
允许我根据项目类型选择模板,这样我就可以创建一个简单的选择器来去掉额外的项目:
public class PointItemTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == CollectionView.NewItemPlaceholder)
return (container as FrameworkElement).TryFindResource("EmptyDataTemplate") as DataTemplate;
else
return (container as FrameworkElement).TryFindResource("MyDataTemplate") as DataTemplate;
}
}
MyDataTemplate
和EmptyDataTemplate
应在ItemsControl
的Resources
部分中定义。EmptyDataTemplate
不需要任何内容。
编辑
@KAI的猜测(见公认答案)是正确的。我的ObservableCollection<T>
绑定到了导致此问题的DataGrid
。我仍然保留我的答案,因为它为其他相关情况提供了解决方案。