如何防止 ComboBox 中的 NewItemPlaceholder 行绑定到与 WPF 中的 DataGrid 相同的 DataTable

Nar*_*ril 5 wpf datatable binding datagrid combobox

我是一个使用页面的向导样式应用程序,用户可以通过下一个和上一个按钮或通过使用导航栏直接访问某些页面在它们之间导航。

在一个页面上(我将其称为“网格页面”),我将一个 DataGrid 绑定到一个 DataTable。DataTable 中有一些初始数据,但用户可以使用 DataGrid 随意添加、编辑和删除行。在下一页(我将称之为“组合框页面”)有一个 ComboBox,它与网格页面上的 DataGrid 绑定到相同的 DataTable。两个页面都使用相同的对象作为数据上下文。

如果我直接跳转到组合框页面,一切正常,组合框在 DataTable 中的每一行都有一个条目,就像它应该的那样。现在我导航到网格页面,不要触摸那里的任何东西,然后再次转到组合框页面。现在 ComboBox 显示一个新项目,一个 NewItemPlaceholder。显然,这是因为 DataGrid 将 UserCanAddRows 设置为 true,从而为新项目显示占位符行。但这应该只涉及 DataGrid 而不是绑定的 DataTable,所以在我看来这是一个错误,或者至少是一个绝对可怕的设计。

当然,我不想在我的 ComboBox 中使用 NewItemPlaceholder(并且选择它会导致很多问题)。那么如何防止它显示在 ComboBox 中呢?

更新:与此同时,我发现占位符项目不在 DataTable 中作为一行,这使它变得更加奇怪,除非 DataTable 中有一个标志说“此表中有一个 NewItemPlaceholder”但不是一行本身。此外,当我注册到 ComboBox 的 Initialized 事件时,我有我正在寻找的 2 个项目,当我注册到 Loaded 事件时,我也有 NewItemPlaceholder,因此必须将它添加到这两个事件之间的某个位置。

小智 5

使用 CollectionViewSource。当多个控件共享集合的相同视图时,例如当一个集合在一种情况下绑定到 DataGrid 而在另一种情况下绑定到 ComboBox 时,就会出现问题。如果 DataGrid 允许用户添加项目(即 DataGrid 的 CanUserAddRows 为 true),则 NewItemPlaceholder 可能已添加到视图中。尝试类似的东西

<UserControl >
<UserControl.Resources >
    <CollectionViewSource Source="{Binding MyCollection}"
             x:Key="SourceWithoutNewItemPlaceholder" />
</UserControl.Resources>

  <Grid Name="LayoutGrid" >

   <ComboBox ItemsSource={Binding Source={StaticResource SourceWithoutNewItemPlaceholder}} >

  </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)


Nar*_*ril 0

经过多次尝试失败后我找到了2个解决方案:

1)在页面的 Loaded 事件中,我在后面的代码中进行了绑定,不是绑定到 DataTable 本身,而是绑定到 DataTable.ToList。如果我这样做,NewItemPlaceholder 将不会显示。

2)在视图模型中,我创建一个新属性,它返回 DataTable.ToList 并绑定到它。这样我就可以在 XAML 中进行绑定。

仅供参考,方法不起作用:ComboBox 上的 Filter 属性抛出 NotSupportedException,似乎 DataTable 不支持此操作。在 ComboBox 的 Loaded 事件中删除 NewItemPlaceholder 也不起作用,因为设置 ItemsSource 后无法删除项目。离开带有数据网格的页面时删除 NewPlaceHolderItem 也不起作用,因为我找不到它在哪里(它不在 DataTable 或 DataTable 的视图中)