2012-11-12 1 views
1

내보기 모델에 ObservableCollection의 "things"가 있고 추가로 ObservableCollections에있는 해당 목록의 하위 집합이 일부 필터링되었습니다. 화면에 두 개의 DataGrid가 있고 각각 ObservableCollections 하위 집합 중 하나에 바인딩했습니다.WPF Datagrid는 항목이 격자에없는 경우 SelectedItem 변경 사항을 무시합니다.

두 DataGrid의 SelectedItem 속성은 뷰 모델의 SelectedThing 속성에 바인딩됩니다.

프로그래밍 방식으로 또는 두 격자 중 하나에서 행을 선택하여 SelectedThing을 변경하면 예상대로 변경됩니다. SelectedThing이 가리키는 항목이 모눈에있는 경우 모눈은 선택한 항목을 업데이트합니다.

그래서 여기 내 문제가 ... SelectedThing이 그리드의 ItemSource에 존재하지 않는다면 선택은 아무 일도 일어나지 않고 SelectedThing이 변경되기 전의 상태로 유지됩니다. 이상적으로 기본보기 모델 속성이 더 이상 그리드의 ItemsSource에서 무언가로 설정되지 않은 경우 선택 사항을 지우고 싶습니다 ... 누구든지 제안 사항이 있습니까?

답변

2

확인. 알았어. 다른 사람에게 도움이되는 경우에는 다음을 수행하십시오. 코드 숨김에서보기 모델의 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; 
      } 
     } 
    }