1

ビューモデルに「things」のObservableCollectionがあり、追加のObservableCollectionsにそのリストのいくつかのフィルターされたサブセットがあります。画面に2つのDataGridがあり、それぞれをサブセットObservableCollectionsの1つにバインドしています。

両方のDataGridには、ViewモデルのSelectedThingプロパティにバインドされたSelectedItemプロパティがあります。

プログラムで、または2つのグリッドのいずれかで行を選択してSelectedThingを変更すると、期待どおりに変更されます。SelectedThingが指すアイテムがグリッドに存在する場合、グリッドは選択されたアイテムを更新します。

これが私の問題です...SelectedThingがグリッドのItemSourceに存在しない場合、選択は何も起こらなかったように動作し、SelectedThingが変更される前の状態のままになります。理想的には、基になるビューモデルプロパティがグリッドのItemsSource内の何かに設定されなくなった場合に、選択をクリアしたいと思います...誰か提案がありますか?

4

1 に答える 1

2

Ok。動作しました。将来誰かに役立つ場合に備えて、これが機能した理由です...コードビハインドで、ビューモデルのPropertyChangedイベントのイベントハンドラーを登録し、それを使用して各グリッドをチェックし、次のアイテムが含まれているかどうかを確認します選択されました。そうでない場合は、そのグリッドで選択されているものをクリアします。また、デッドロックを回避するために着信NULL値を無視するようにSelectedThingプロパティを変更しました(私のアプリでは、初期化後に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 に答える