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

时间:2016-05-13 04:13:24

标签: wpf data-binding itemscontrol

ItemsControl绑定到ObservableCollection<T>会在运行时在控件中添加额外的{NewItemPlaceholder}。我该如何删除它?

NB 我看过posts related to this problem但这些仅限于DataGrid,您可以设置CanUserAddRowsIsReadOnly属性以摆脱此问题项目。 ItemsControl没有任何此类财产。

XAML

此处我的ItemsControl(基础ViewModel中MyPointsObservableCollection<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}对象。

2 个答案:

答案 0 :(得分:2)

MSDN写道:

  

实施CollectionView的{​​{1}}时   IEditableCollectionView设置为NewItemPlaceholderPositionAtBeginning   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}}部分中定义

EmptyDataTemplateResourcesItemsControl不需要任何内容​​。

修改

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