gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:55 25 4
gpt4 key购买 nike

所有,我最近遇到了一个问题,当滚动选定的行(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com