C# DataGrid正在进行不必要的重新排列

C# DataGrid正在进行不必要的重新排列,c#,.net,wpf,datagrid,C#,.net,Wpf,Datagrid,当我不希望WPFDataGrid重新排列行时,我遇到了问题 步骤: 应用分组 按组中包含重复项的列对数据网格进行排序 更改不在已排序列中的单元格 请注意,行会重新排序,将编辑的行移动到排序列中具有匹配值的行集合的底部 示例(请注意按姓氏排序): 将Wilma的金额从22更改为18将导致DataGrid重新安排如下: FirstName | LastName ^ | Amount ----------+------------+--------- Group:Flinstone Fred

当我不希望WPF
DataGrid
重新排列行时,我遇到了问题

步骤:

  • 应用分组
  • 按组中包含重复项的列对数据网格进行排序
  • 更改不在已排序列中的单元格
  • 请注意,行会重新排序,将编辑的行移动到排序列中具有匹配值的行集合的底部
  • 示例(请注意按姓氏排序):

    将Wilma的金额从22更改为18将导致DataGrid重新安排如下:

    FirstName | LastName ^ | Amount
    ----------+------------+---------
    Group:Flinstone
    Fred      | Flinstone  | 42
    Pebbles   | Flinstone  | 28
    Dino      | Flinstone  | 64
    Wilma     | Flinstone  | 18
    
    如何阻止
    DataGrid
    像这样重新排列行

    注意:如果
    DataGrid
    没有应用任何分组,则不会发生不需要的重新排序

    以下是我正在使用的代码:

    视图模型:

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

    这不是最好的解决方案,但在过去,我通过在数据源中而不是在DataGridView中对数据进行排序来避免这个问题。我从中学到了如何做到这一点。(我总是把有用的编码技巧加入书签)

    我希望这就是你想要的


    编辑:底部倒数第二篇文章才是真正有效的文章。

    您可以使用附加属性覆盖特定列的默认排序行为(即使单击了列标题),这将解决您的问题。使用此解决方案,单击标题将应用自定义排序顺序,无论基础数据发生任何更改,排序顺序都应保持“活动”


    您能否显示更改的代码(将wilma的金额从22更改为18)?@DrDev I通过用户界面而不是代码更改wilma的金额。您能否总结一下链接中找到的解决方案?在查找其他信息时,链接非常有用,但是。
    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;
        }
    }