DataGrid 进行不必要的重新排列

Posted

技术标签:

【中文标题】DataGrid 进行不必要的重新排列【英文标题】:DataGrid doing unwanted rearranging 【发布时间】:2013-06-15 05:29:31 【问题描述】:

当我不想让 WPF DataGrid 重新排列我的行时,我遇到了麻烦。

步骤:

    应用分组 将DataGrid按组内重复的列排序 更改不在排序列中的单元格 观察行重新排序,将已编辑的行移动到在其排序列中具有匹配值的行集的底部

示例(注意按姓氏排序):

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;
    

【问题讨论】:

你能显示你进行更改的代码吗(威尔玛的金额从 22 到 18)? @DrDev 我通过 UI 而不是代码来更改 Wilma 的金额。 【参考方案1】:

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

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

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

【讨论】:

您能否总结一下链接中找到的解决方案?寻找更多信息时,链接非常有用,但on their own they are not good answers。【参考方案2】:

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

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

【讨论】:

以上是关于DataGrid 进行不必要的重新排列的主要内容,如果未能解决你的问题,请参考以下文章

vb中datagrid控件怎么更新?

easyui------设置datagrid('getEditor')时焦点问题

如何将图像设置为 DataGrid 标题背景?

如何将工厂用于 DataGrid.CanUserAddRows = true

从List与对象绑定

WPF Datagrid横向排列