Привязка Selected RowCount к TextBlock без запуска OnPropertyChanged после прокрутки DataGrid

Все, недавно у меня возникла проблема, когда визуальные эффекты DataGrid не обновлялись при прокрутке выбранных строк (Столбец WPF DataGrid становится поврежденным при использовании множественного выбора), что было решено с помощью метода, описанного в связанном ответе.

У меня есть TextBlock в StatusBar, и я привязываю это к свойству IsSelected к требуемой ViewModel. Я думал, что решение вопроса выше также решит тот факт, что количество выбранных строк не обновлялось правильно; то есть он обновляется нормально, когда полоса прокрутки DataGrid не перемещается, но когда полоса перемещается, TextBlock не обновляется, поскольку событие OnPropertyChanged не запускается. Я проверил множество сообщений об этом и установил 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>

Где модель представления, на которую ссылается это

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 перестает обновляться при прокрутке DataGrid. Как мне остановить это и позволить отображать количество строк даже в этом случае?

Спасибо за ваше время.


person MoonKnight    schedule 08.07.2013    source источник


Ответы (1)


Можете ли вы просто подключиться к событию SelectedItems.CollectionChanged внутри LoadCultures()?

Cultures.SelectedItems.CollectionChanged += SelectedItems_CollectionChanged;

void SelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    this.RaisePropertyChanged("TotalSelectedCultures");
}
person sfm    schedule 15.07.2013
comment
Можете ли вы объяснить дальше? В этом случае модель представления слушает свойство SelectedItems (свое собственное собрание моделей представления) (уже привязанное к вашему представлению) и просто объявляет об изменении TotalSelectedCultures, что заставит любые представления, привязанные к этому свойству, обновиться. - person sfm; 15.07.2013