2

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

我有一个TextBlockStatusBar我将它绑定到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,即使在这种情况下,如何停止更新并允许显示行数?

谢谢你的时间。

4

1 回答 1

0

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

Cultures.SelectedItems.CollectionChanged += SelectedItems_CollectionChanged;

void SelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    this.RaisePropertyChanged("TotalSelectedCultures");
}
于 2013-07-15T04:00:44.570 回答