2013-07-08 3 views
2

모두 최근에 연결된 행의 메서드를 사용하여 선택한 행 (WPF DataGrid Column Becoming Corrupt when using Multi-Selection)이 스크롤되었을 때 DataGrid의 비주얼이 업데이트되지 않는 문제가있었습니다 .선택한 RowCount를 TextBlock에 연결하지 않고 DataGrid 스크롤을 OnPropertyChanged하는 경우

나는 에 TextBlock을 가지고 있으며 이것을 필요한 ViewModel의 IsSelected 속성에 연결합니다. 위의 질문에 대한 해결책은 선택한 행 수가 올바르게 업데이트되지 않았다는 사실도 해결할 것이라고 생각했습니다. 즉, DataGrid 스크롤 막대가 이동하지 않지만 막대가 이동하면 OnPropertyChanged 이벤트가 발생하지 않아 TextBlock이 업데이트되지 않습니다. 나는 이것에 관해 많은 수표를 가지고 있고, 선택을 만드는 데 도움이 된 IsAsync=true을 설정한다. (그것은이 업데이트 전에 1이었다.) 관련 XMAL는

<DataGrid Grid.Row="1" AlternatingRowBackground="Gainsboro" AlternationCount="2" 
      HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="True" 
      CanUserAddRows="False" CanUserDeleteRows="False" SelectionMode="Extended" 
      EnableRowVirtualization="True" EnableColumnVirtualization="True" 
      ItemsSource="{Binding Cultures, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, IsAsync=True}" 
      dataAccess:MultiSelectItem.IsEnabled="True"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="Code" Binding="{Binding Code}" IsReadOnly="True"/> 
    <DataGridTextColumn Header="Language" Binding="{Binding Language}" IsReadOnly="True"/> 
    <DataGridTextColumn Header="LocalName" Binding="{Binding LocalName}" IsReadOnly="True"/> 
</DataGrid.Columns> 
</DataGrid> 

<StatusBar Grid.Row="1" Margin="0,0.4,0.4,-0.4"> 
    <StatusBarItem DockPanel.Dock="Left" Background="#FF007ACC" Margin="0,2,0,0"> 
     <TextBlock Text="{Binding TotalSelectedCultures}" Margin="5,0,0,0" Foreground="White"/> 
    </StatusBarItem> 
</StatusBar> 

인 경우이 링크는 DataGrid 스크롤, 어떻게이 정지 할 때 업데이트

public class CultureDataViewModel : ViewModelBase 
{ 
    public enum FilterType 
    { 
     AllCultures, 
     NeutralCultures, 
     SpecificCultures 
    }; 
    public FilterType SelectedFilterType { get; private set; } 
    public ICollectionView CulturesView { get; private set; } 
    public MultiSelectCollectionView<CultureViewModel> Cultures { get; private set; } 

    public CultureDataViewModel() 
    { 
     SelectedFilterType = FilterType.AllCultures; 
     LoadCultures(); 
    } 

    void OnCultureViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     string IsSelected = "IsSelected"; 
     (sender as CultureViewModel).VerifyPropertyName(IsSelected); 
     if (e.PropertyName == IsSelected) 
      this.OnPropertyChanged("TotalSelectedCultures"); 
    } 

    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null && e.NewItems.Count != 0) 
      foreach (CultureViewModel cultVm in e.NewItems) 
       cultVm.PropertyChanged += this.OnCultureViewModelPropertyChanged; 

     if (e.OldItems != null && e.OldItems.Count != 0) 
      foreach (CultureViewModel cultVm in e.OldItems) 
       cultVm.PropertyChanged -= this.OnCultureViewModelPropertyChanged; 
    } 

    /// <summary> 
    /// Load the avalible cultures depending on filter selection 
    /// </summary> 
    public void LoadCultures() 
    { 
     // Get data... 
    } 

    /// <summary> 
    /// Hold the current total selected cultures to add to the resource 
    /// data set. 
    /// </summary> 
    public string TotalSelectedCultures 
    { 
     get 
     { 
      int selectedCultures = this.Cultures.SelectedItems.Count; 
      return String.Format("{0:n0} of {1:n0} cultures selected", 
             selectedCultures, 
             Cultures.Count); 
     } 
    } 
} 

TotalSelectedCultures 정거장 및 행 개수도에 표시 할 수 있도록 뷰 모델 이 경우?

감사합니다.

답변

0

LoadCultures()의 SelectedItems.CollectionChanged 이벤트에 간단하게 첨부 할 수 있습니까?

Cultures.SelectedItems.CollectionChanged += SelectedItems_CollectionChanged; 

void SelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    this.RaisePropertyChanged("TotalSelectedCultures"); 
} 
+0

이렇게하면 MVVM 패턴이 깨집니다. – MoonKnight

+0

자세히 설명해 주시겠습니까? 이 경우 ViewModel은 (자신의 뷰 모델 컬렉션 문화권) SelectedItems 속성 (이미보기에서 바인딩 됨)을 수신하고 TotalSelectedCultures가 변경되었음을 간단히 알립니다.이 속성에 바인딩 된 모든보기가 업데이트되도록합니다. – sfm