wpf - 如何防止 ComboBox 中的 NewItemPlaceholder 行绑定(bind)到与 WPF 中的 DataGrid 相同的 DataTable

标签 wpf binding datagrid combobox datatable

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

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

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

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

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

最佳答案

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

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

  <Grid Name="LayoutGrid" >

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

  </Grid>
</UserControl>

关于wpf - 如何防止 ComboBox 中的 NewItemPlaceholder 行绑定(bind)到与 WPF 中的 DataGrid 相同的 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080111/

相关文章:

wpf - 如何隐藏 WPF DataGrid 中的列标题?

wpf - 在选定的数据网格上显示一个按钮

C# 获取数据库行中的所有项目

c# - WPF ListBox,自动添加 "new element"行

wpf - 访问 AdornedElementPlaceholder 上的属性的 Validation.ErrorTemplate

javascript - 如何使用网页与 android 代码交互?

java - Java 中的动态绑定(bind)遇到问题

wpf - 应用 CollectionView 筛选器后如何绑定(bind) DataGrid 行计数?

wpf - DataGrid 行标题模板和行验证问题

c# - 无法加载 DLL 'pjsua2' 或其依赖项之一 : The specified module could not be found. (0x8007007E)