2017-12-17 1 views
1

가상화를 사용하는 DataGrid를 사용할 수 있으며 다중 선택이 작동하려고합니다. 내가 DataGrid.ItemContainerStyle가상화를 사용하는 WPF DataGrid Multiselect MVVM

 <DataGrid.ItemContainerStyle > 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"></Setter> 
      </Style> 

내가 스크롤되지 않는 경우 가상화를 사용할 경우, 또는 모든 것이 잘 작동하지만 곧 내가 가상화 활성화 DataGridRows로 스크롤 작동이 중지 출력 및 간다를 정의

기억으로부터. IsSelected 속성은 내 뷰 모델에서 IsSelected 설정을 중지합니다.

또한 자신을 처리하기 위해 DependencyProperty를 만들려고했습니다. 그러나 일단 선택된 행으로 스크롤을 시작하면 임의의 이벤트가 전송됩니다. 내가 선택하지 않은 행은 예를 들어 때때로 호출되며 이벤트는 여러 번 트리거됩니다.

나는 이것이 기본적으로 효과가 있어야한다고 생각합니다. 다중 선택이 효과가 있는지, 내가 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?

답변

1

난 (XAML)

<DataGrid dependencyProperties:DataGridSelectedItemsDependencyProperty.SelectedItemsChangedHandler="{Binding SelectedItemsChanged}"

종속성 속성 내보기 같이 사용하는 것이

public static class DataGridSelectedItemsDependencyProperty 
    { 
     public static readonly DependencyProperty SelectedItemsChangedHandlerProperty = 
      DependencyProperty.RegisterAttached("SelectedItemsChangedHandler", 
       typeof(ICommand), 
       typeof(DataGridSelectedItemsDependencyProperty), 
       new FrameworkPropertyMetadata(OnSelectedItemsChangedHandlerChanged)); 


     public static ICommand GetSelectedItemsChangedHandler(DependencyObject element) 
     { 
      if (element == null) 
       throw new ArgumentNullException(nameof(element)); 

      return element.GetValue(SelectedItemsChangedHandlerProperty) as ICommand; 
     } 

     public static void SetSelectedItemsChangedHandler(DependencyObject element, ICommand value) 
     { 
      if (element == null) 
       throw new ArgumentNullException(nameof(element)); 

      element.SetValue(SelectedItemsChangedHandlerProperty, value); 
     } 

     private static void OnSelectedItemsChangedHandlerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var dataGrid = (DataGrid)d; 

      if (e.OldValue == null && e.NewValue != null) 
       dataGrid.SelectionChanged += ItemsControl_SelectionChanged; 

      if (e.OldValue != null && e.NewValue == null) 
       dataGrid.SelectionChanged -= ItemsControl_SelectionChanged; 
     } 

     private static void ItemsControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      var dataGrid = (DataGrid)sender; 
      var itemsChangedHandler = GetSelectedItemsChangedHandler(dataGrid); 
      itemsChangedHandler.Execute(dataGrid.SelectedItems); 
     } 
    } 

를 생성하여 그것을 해결

관련 문제