c# - 将选定的 RowCount 绑定(bind)到 TextBlock,在 DataGrid 滚动后未触发 OnPropertyChanged

标签 c# wpf mvvm datagrid rowcount

所有,我最近遇到了一个问题,当滚动选定的行(WPF DataGrid Column Becoming Corrupt when using Multi-Selection)时,DataGrid 的视觉效果没有更新,该问题已使用链接答案中的方法解决。

我在 StatusBar 中有一个 TextBlock 并将其绑定(bind)到所需 ViewModel 的 IsSelected 属性。我认为上述问题的解决方案也可以解决所选行数未正确更新的事实;也就是说,当 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>

这个链接到的 View 模型在哪里

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);
        }
    }
}

TotalSelectedCulturesDataGrid 滚动时停止更新,即使在这种情况下如何停止更新并允许显示行数?

感谢您的宝贵时间。

最佳答案

您可以简单地附加到 LoadCultures() 中的 SelectedItems.CollectionChanged 事件吗?

Cultures.SelectedItems.CollectionChanged += SelectedItems_CollectionChanged;

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

关于c# - 将选定的 RowCount 绑定(bind)到 TextBlock,在 DataGrid 滚动后未触发 OnPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17537276/

相关文章:

c# - 格式化导航栏颜色并在 Razor 中添加分隔线

c# - 在 C# 应用程序中播放视频

c# - 在WPF复选框列表中设置焦点

c# - MVVM,对ViewModelLocator和DataTemplate感到困惑,导致ViewFirst vs ViewModel First

c# - LINQ 包含来自字符串数组的一个匹配项

c# - 如何从打印机变量中获取纸张大小?

c# - 模拟来自 Azure Service Fabric 群集的 10,000 个 Azure IoT 中心设备连接

wpf - 在哪里可以找到 native WPF 控件的 Generic.xaml?

c# - 是否有Visual Studio之类的代码编辑器控件?

silverlight - Silverlight 中的 MVVM (ICommand)