数据网格正在进行不必要的重新排列

本文关键字:新排列 排列 数据网 网格 正在进行 不必要 数据 | 更新日期: 2023-09-27 18:18:52

我在WPF DataGrid重新安排我的行时遇到了麻烦,当我不希望它。

步骤:

    <
  1. 应用分组/gh>
  2. 按组
  3. 内具有重复项的列对DataGrid进行排序
  4. 更改不在已排序列中的单元格
  5. 观察行重新排序,将编辑的行移动到在其排序列中具有匹配值的行集的底部

示例(注意按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