将Itemscontrol绑定到ObservableCollection:额外生成的项



ItemsControl绑定到ObservableCollection<T>会在运行时在控件中放置一个额外的{NewItemPlaceholder}。如何移除它?

N。B.我看到过与此问题相关的帖子,但这些帖子仅限于DataGrid,您可以在其中设置CanUserAddRowsIsReadOnly属性以消除此项目。ItemsControl不具有这样的性质。

XAML

这是我的ItemsControlMyPoints是底层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}对象。

MSDN编写以下内容:

当实现IEditableCollectionViewCollectionView具有NewItemPlaceholderPosition设置为AtBeginningAtEndCCD_ 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;
  }
}

MyDataTemplateEmptyDataTemplate应在ItemsControlResources部分中定义。EmptyDataTemplate不需要任何内容。

编辑

@KAI的猜测(见公认答案)是正确的。我的ObservableCollection<T>绑定到了导致此问题的DataGrid。我仍然保留我的答案,因为它为其他相关情况提供了解决方案。

最新更新