将ItemsControl
绑定到ObservableCollection<T>
会在运行时在控件中添加额外的{NewItemPlaceholder}
。我该如何删除它?
NB 我看过posts related to this problem但这些仅限于DataGrid
,您可以设置CanUserAddRows
或IsReadOnly
属性以摆脱此问题项目。 ItemsControl
没有任何此类财产。
XAML
此处我的ItemsControl
(基础ViewModel中MyPoints
为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}
对象。
答案 0 :(得分:2)
MSDN写道:
实施
CollectionView
的{{1}}时IEditableCollectionView
设置为NewItemPlaceholderPosition
或AtBeginning
AtEnd
已添加到集合中。NewItemPlaceholder
总是出现在收藏中;它不参与分组, 排序或过滤。
链接:MSDN
希望如果您将NewItemPlaceholder
设置为其他内容,占位符将从集合中消失。
修改:
如果你的NewItemPlaceholderPosition
被绑定到其他地方(例如:到ObservableCollection<T>
,则必须将DataGrid
设置为false),你必须处理其他项目。它会为您的收藏集添加新的CanUserAddRows
。
答案 1 :(得分:1)
最后终于!
花了一天之后,解决方案变得简单(虽然并不理想)。 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
的{{1}}部分中定义 EmptyDataTemplate
和Resources
。 ItemsControl
不需要任何内容。
@KAI的猜测(见接受的答案)是正确的。我的EmptyDataTemplate
绑定了导致此问题的ObservableCollection<T>
。我仍然会在这里保留我的答案,因为它为其他相关情况提供了解决方案。