2011-07-26 4 views
8

나는 이것을 조사하고 난처함을 느낀다. 나는 WPF DataGrid를 가지고 있고 MVVM 모델을 사용하고있다. 특정 상황에서 DataGrid의 행을 변경하는 기능을 사용하지 못하게하고 싶습니다. 나는 이것을 연구하고 발견 한 것과 같은 기술을 시도했다. here.DataGrid의 행 변경 방지

실제로이 방법은 효과적이지만 '깜박임'이 있습니다 (클릭 한 행을 선택하고 잠시 후에 이전 선택으로 되돌아갑니다). 처음에는 행 변경을 전혀 막을 수 있습니다.

SelectionChanging 또는 BeforeSelectionChanged가 없기 때문에 이벤트가 취소되는 것을 취소 할 수 있습니다. 강제로 내 뷰 모델에서 인덱스 변경을 막아도 아무런 차이가없는 것처럼 보입니다.

어떻게하면됩니까?

감사합니다.

답변

5

previewkeydownpreviewmousedown 이벤트를 수행하고 특정 상황에서 e.Handled=true으로 전화하면 어떻게됩니까?

편집 : 가 MVVM 스타일을 만족 : 당신은 당신이 당신의 상황을 결합 할 수있는 BehaviorDependencyProperty로 만들 수 있습니다. 이 동작에서는 사용자가 데이터row 또는 헤더를 클릭하는 것처럼 이벤트 및 기타 다른 것들을 처리 할 수 ​​있습니다.

+0

전 제안은 완벽하게 작동했습니다 (후자는 매우 흥미로운 제안이지만 시도해 보았습니다). 감사합니다. – Mani5556

2

DispatcherPriority가 ContextIdle로 설정되었습니다. SelectedItem이 두 번 설정되고 (두 번 렌더링 되었기 때문에) 깜박입니다. 우선 순위를 보통으로 설정하면 더 이상 깜박 거리지 않습니다.

+0

덕분에 도움이되었습니다. 감사합니다. –

0

PreviewMouseDown 메서드 here에 대한 몇 가지 예가 있습니다.

일반적으로 DataGrid.SelectedItem을 DataGrid의 SelectionChanged 핸들러 내에서 원래 값으로 되 돌리는 것은 예상대로 작동하지 않습니다. Dispatcher에게 나중에 스케줄을달라고 요청함으로써 취소를 연기하는 모든 코드 예제가 있습니다.

DataGrid에 CellStyle이 있습니까? 나를 위해,이 일을 다음

XAML :

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="Background" Value="DarkSlateBlue"/> 
       <Setter Property="Foreground" Value="White"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

코드 숨김 :

private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count > 0) 
    { 
     object x = e.AddedItems[0]; 
     if (x is MyObjectType && x != myViewModel.CurrentItem && 
      myViewModel.ShouldNotDeselectCurrentItem()) 
     { 
      // this will actually revert the SelectedItem correctly, but it won't highlight the correct (old) row. 
      this.MyDataGrid.SelectedItem = null; 
      this.MyDataGrid.SelectedItem = myViewModel.CurrentItem; 
     } 
    } 
} 

이 점은 SelectedCellsChanged 이벤트가 인 selectionchanged 이벤트 후 해고이었다 - 그리고 특히, 설정이 SelectedItem이 읽기 전용 속성 인 SelectedCell을 올바르게 업데이트하지 않으므로 코드 숨김이 더 많이 발생합니다.

private void MyDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
{ 
    List<DataGridCellInfo> selectedCells = MyDataGrid.SelectedCells.ToList(); 

    List<MyObjectType> wrongObjects = selectedCells.Select(cellInfo => cellInfo.Item as MyObjectType) 
     .Where (myObject => myObject != myViewModel.CurrentItem).Distinct().ToList(); 
    if (wrongObjects.Count > 0) 
    { 
     MyDataGrid.UnselectAllCells(); 
     MyDataGrid.SelectedItem = null; 
     MyDataGrid.SelectedItem = myViewModel.CurrentItem; 
    } 
} 

분명히 처리기는 데이터 그리드의 해당 이벤트에 연결되어야합니다.

예상대로 작동하고 원하는 경우 선택 변경을 적절히 취소했으며 깜박임을 생성하지 않았습니다.