如果项目不在网格中,WPF Datagrid将忽略SelectedItem更改

时间:2012-11-12 04:02:27

标签: wpf datagrid selecteditem

我的视图模型中有一个ObservableCollection“things”,并且在additonal ObservableCollections中有几个已过滤的列表子集。我在屏幕上有两个DataGrids,我将它们分别绑定到一个子集ObservableCollections。

两个DataGrids都将其SelectedItem属性绑定到视图模型中的SelectedThing属性。

当我以编程方式更改SelectedThing或通过选择两个网格之一中的行时,它将按预期更改。如果SelectedThing现在指向的项目存在于网格中,则网格将更新其选定的项目。

所以这就是我的问题......如果网格的ItemSource中不存在SelectedThing,则选择就像没有发生任何事情一样,并保持在SelectedThing更改之前的状态。理想情况下,如果基础视图模型属性不再设置为网格的ItemsSource中的某些内容,我希望选择清除...任何人都有任何建议吗?

1 个答案:

答案 0 :(得分:2)

确定。搞定了。如果它在将来帮助其他人,这就是它的工作原理...... 在您的代码中,为视图模型的PropertyChanged事件注册事件处理程序,然后使用它来检查每个网格以查看它是否包含所选项目。如果没有,则清除该网格中的选定内容。我还修改了我的SelectedThing属性以忽略传入的NULL值以避免死锁(在我的应用程序中,它在初始化后永远不会为NULL)

_vm是一个返回我的视图模型的属性。

  _vm.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(_vm_PropertyChanged);

   void _vm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
   {
      if (e.PropertyName == "SelectedThing")
      {
          CheckSelection(grid1, _vm.SelectedThing);
          CheckSelection(grid2, _vm.SelectedThing);
      }
   }

   void CheckSelection(DataGrid grid, object selectedItem)
   {
      if (grid.ItemsSource != null)
      {
          bool itemInGrid = false;
          foreach (var item in grid.ItemsSource)
          {
              if (item == selectedItem)
              {
                  itemInGrid = true;
                  break;
              }
          }

          if (!itemInGrid) // clear selection
          {
              grid.SelectedItem = null;

              // not sure why, but this causes the highlight to clear.  Doesn't work otherwise
              grid.IsEnabled = false;
              grid.IsEnabled = true;
          }
      }
   }