6

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

脚步:

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

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

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

2 回答 2

0

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

我希望这就是你要找的!

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

于 2013-06-22T00:30:55.047 回答
0

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

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

于 2013-11-13T11:30:50.237 回答