DataGrid做了不需要的重新排列

时间:2013-06-18 20:33:02

标签: c# .net wpf datagrid

我无法使用WPF DataGrid在我不想要的时候重新排列行。

步骤:

  1. 应用分组
  2. 按照组
  3. 中的重复列对DataGrid进行排序
  4. 更改不在已排序列中的单元格
  5. 观察行重新排序将已编辑的行移动到排序列中具有匹配值的行集的底部
  6. 示例(注意按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没有应用任何分组,则不会发生不需要的重新排序。

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

    视图模型:

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

2 个答案:

答案 0 :(得分:0)

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

我希望这就是你要找的东西!

编辑:底部的倒数第二个帖子实际上是有效的。

答案 1 :(得分:0)

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

https://stackoverflow.com/a/18218963/2115261