1

我的视图模型中有一个“事物”的 ObservableCollection,并且在附加的 ObservableCollections 中有几个过滤后的列表子集。我在屏幕上有两个 DataGrid,我将它们分别绑定到 ObservableCollections 子集之一。

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

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

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

4

1 回答 1

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;
          }
      }
   }
于 2012-11-12T16:26:16.653 回答