【问题标题】:I want my binded DataGrid to NOT sort the ItemsSource too我希望我绑定的 DataGrid 也不要对 ItemsSource 进行排序
【发布时间】:2018-02-20 15:29:44
【问题描述】:

我有一个DataGrid,我通过ItemsSource-Property 绑定到ObservableCollection。此 DataGrid 是 IsReadOnly="True"AutoGenerateColumns="False"。 (在 XAML 中添加了列)

到目前为止一切正常,但是: 当我按列对 a 进行排序时,ItemsSource 也会被排序。我希望用户能够在不实际的ItemsSource 也被排序的情况下对列进行排序。

这可能吗?如果可以,我该如何管理?

编辑: 问题应该是可以重现的。当您点击 Number-header 时,ComboBox 项目与 DataGrid 具有相同的新顺序。

主窗口的 XAML:

<DockPanel LastChildFill="True">
    <ComboBox DockPanel.Dock="Bottom" Name="cbItems" IsEditable="True"/>
    <DataGrid Name="dataGrid" AutoGenerateColumns="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            <DataGridTextColumn Binding="{Binding SomeNumber}" Header="SomeNumber"/>
        </DataGrid.Columns>
    </DataGrid>
</DockPanel>

代码:

public partial class MainWindow : Window
{
    ObservableCollection<Item> ItemList;

    public MainWindow()
    {
        InitializeComponent();

        ItemList = new ObservableCollection<Item>();

        Random rnd = new Random();
        for(int i = 0; i < 15; i++)
            ItemList.Add(new Item("blabla" + rnd.Next(10, 100), rnd.Next(10000, 100000)));

        dataGrid.ItemsSource = ItemList;
        cbItems.ItemsSource = ItemList;
    }
}

public class Item
{
    private string name;
    private int number;

    public Item(string name, int number)
    {
        this.name = name;
        this.number = number;
    }

    public string Name { get { return name; } set { name = value; } }
    public int SomeNumber { get { return number; } set { number = value; } }

    public override string ToString()
    {
        return name;
    }
}

【问题讨论】:

  • 默认情况下,当您对 DataGrid 进行排序时,源集合得到排序。为什么你认为源集合被排序了?
  • 在我的主窗口中,我有一个绑定到同一个 ObservableCollection 的 ComboBox。当我按 DataGrid 中的列排序时,其中的项目得到相同的排序
  • 如果您希望任何人能够告诉您您做错了什么,请发布您的代码:stackoverflow.com/help/mcve
  • 我不知道要发布什么代码,因为我自己一点也不知道问题出在哪里。整个项目1000多行……
  • 我只是通过调试器单步完成了我的带有 DataGrid 的窗口已打开并加载。当我单击列标题时,我的 MainWindow 上的 DataGrid 和 ComboBox 会被排序,而调试器不会进入我的代码中的任何位置。

标签: c# wpf data-binding datagrid


【解决方案1】:

您应该能够通过将ItemsSource 属性设置为两个独立的视图来克服两个控件将引用同一个集合视图的事实:

dataGrid.ItemsSource = new ListCollectionView(ItemList);
cbItems.ItemsSource = new ListCollectionView(ItemList);

【讨论】:

  • 感谢您的耐心等待。我什至不知道ListCollectionView 是一回事。今天我学会了...
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2013-08-30
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多