数据网格正在进行不必要的重新排列
本文关键字:新排列 排列 数据网 网格 正在进行 不必要 数据 | 更新日期: 2023-09-27 18:18:52
我在WPF DataGrid
重新安排我的行时遇到了麻烦,当我不希望它。
步骤:
- <
- 应用分组/gh>
- 按组 内具有重复项的列对
- 更改不在已排序列中的单元格
- 观察行重新排序,将编辑的行移动到在其排序列中具有匹配值的行集的底部
DataGrid
进行排序示例(注意按LastName排序):
FirstName | LastName ^ | Amount
----------+------------+---------
Group:Flinstone
Fred | Flinstone | 42
Wilma | Flinstone | 22
Pebbles | Flinstone | 28
Dino | Flinstone | 64
将Wilma的数量从22更改为18将导致DataGrid重新排列如下:
FirstName | LastName ^ | Amount
----------+------------+---------
Group:Flinstone
Fred | Flinstone | 42
Pebbles | Flinstone | 28
Dino | Flinstone | 64
Wilma | Flinstone | 18
我如何阻止DataGrid
重新排列这样的行?
注意:如果DataGrid
没有任何分组应用于它,则不会发生不必要的重新排序。
ViewModel:
public class MainViewModel
{
public ObservableCollection<Item> Items { get; set; }
public ListCollectionView ItemsView { get; set; }
public MainViewModel()
{
Items = new ObservableCollection<Item>();
Items.Add(new Item("Fred", "Flinstone", 42));
Items.Add(new Item("Wilma", "Flinstone", 22));
Items.Add(new Item("Pebbles", "Flinstone", 52));
Items.Add(new Item("Dino", "Flinstone", 52));
Items.Add(new Item("Barney", "Rubble", 32));
Items.Add(new Item("Betty", "Rubble", 62));
Items.Add(new Item("BamBam", "Rubble", 42));
Items.Add(new Item("George", "Jetson", 22));
Items.Add(new Item("Jane", "Jetson", 52));
Items.Add(new Item("Judy", "Jetson", 32));
Items.Add(new Item("Elroy", "Jetson", 62));
Items.Add(new Item("Astro", "Jetson", 42));
ItemsView = new ListCollectionView(Items);
ItemsView.GroupDescriptions.Add(new PropertyGroupDescription("LastName"));
}
}
视图:
<DataGrid
ItemsSource="{Binding ItemsView}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
模型:
public class Item
{
public string FirstName { get; set; }
public string LastName { get; set; }
public decimal Amount { get; set; }
public Item(string firstName, string lastName, decimal amount)
{
FirstName = firstName;
LastName = lastName;
Amount = amount;
}
}
这不是最好的解决方案,但在过去,我通过在数据源中而不是在DataGridView中排序数据来规避这个问题。我从这个论坛上学会了如何做到这一点。(我总是收藏有用的编码技巧)
我希望这就是你要找的!
编辑:底部倒数第二个帖子才是真正有效的。
可以使用附加属性覆盖特定列的默认排序行为(即使在单击列标题时也是如此),这应该可以解决您的问题。使用此解决方案,单击标题将应用您的自定义排序顺序,无论任何底层数据更改,该排序顺序都应保持"活动"。
https://stackoverflow.com/a/18218963/2115261