我有一个DataGrid,它通过Thread每隔几秒钟更新一次数据。 DataGrid需要提供列标题排序,分组和过滤。

我目前有一个DataGrid绑定(bind)到ICollectionView,并且ICollectionView的来源是ObservableCollection。从我在其他线程上阅读的内容来看,这似乎是实现此目的的好方法。

排序“有效”,但是当ICollectionView.Source更新之后更新ObservableCollection时,它会丢失。我尝试在更新之前保存SortDescriptions,并在更新完成后将其重新添加到ICollectionView。但这是相同的结果。

有人可以指出我所缺少的吗?

编辑这是一些代码...

查看(XAML)

<DataGrid ItemsSource="{Binding CollectionView, Source={StaticResource ViewModel}}>

View 模型
public ICollectionView CollectionView
{
    get
    {
        collectionViewSource.Source = dataColl;
        if (SortDescriptions != null)
        {
            foreach (SortDescription sd in SortDescriptions)
            {
                collectionViewSource.View.SortDescriptions.Add(sd);
            }
        }
        collectionViewSource.View.Refresh();
        return collectionViewSource.View;
    }
}

public ObservableCollection<SomeObject> DataColl
{
    get { return dataColl; }
    private set
    {
        this.dataColl= value;
        OnPropertyChanged("CollectionView");
    }
}

以下是每几秒钟更新一次数据的方法...
private void UpdateData()
{
    while (true)
    {
        System.Threading.Thread.Sleep(mDataRefreshRate);

        // SortDescriptions is a Property of the ViewModel class.
        SortDescriptions = collectionViewSource.View.SortDescriptions;

        ObservableCollection<SomeObject> wDataColl
           = new ObservableCollection<SomeObject>();

        //... Irrelevant code that puts the data in wDataColl ...

        DataColl= wDataColl;
    }
}

最佳答案

[YourObservableCollection].ViewHandler.View.Filter
                    += new FilterEventHandler(myFilterHandler);

private void myFilterHandler(object sender, FilterEventArgs e)
{
}

可用于直接添加过滤器处理程序,也可以使用SortDescriptions进行相同操作以添加/删除
[YourObservableCollection].ViewHandler.View.SortDescriptions.Add(mySortDescription);

如果您要最好地进行排序和过滤,以创建自己的类来封装CollectionViewSource并实现添加和删除SortDescriptions和Filtering等

当你说:



更新是什么意思?您的意思是您要更改源?而不是从集合中添加/删除项目?

根据您添加的XAML示例进行编辑:
<DataGrid ItemsSource="{Binding CollectionView, Source={StaticResource ViewModel}}>

您正在将itemsource绑定(bind)到CollectionViewSource,在其中应将datacontext绑定(bind)到它:

例子:
<Page.Resources>
    <CollectionViewSource x:Key="myViewSource"
          Source="{Binding CollectionView, Source={StaticResource ViewModel}}"
    />
</Page.Resources>

在页面中:
<Grid DataContext="{StaticResource myViewSource}">

        <DataGrid x:Name="myGrid"  ItemsSource="{Binding}"...

或类似的规定

编辑再次没有看到代码向下滚动:p
ObservableCollection<SomeObject> wDataColl= new ObservableCollection<SomeObject>();

每次收集时您都会创建新实例,这是主要问题

还:
public ICollectionView CollectionView
{
    get
    {
        collectionViewSource.Source = dataColl;
        if (SortDescriptions != null)
        {
            foreach (SortDescription sd in SortDescriptions)
            {
                collectionViewSource.View.SortDescriptions.Add(sd);
            }
        }
        collectionViewSource.View.Refresh();
        return collectionViewSource.View;
    }
}

在这里,您返回集合时,您需要设置Source并添加SortDescriptions并每次都刷新 View ,您只需要设置一次这些值

如果您添加/删除SortDescriptions,则只会在 View 上调用刷新

我认为您应该掌握CollectionViewSource的基础知识

关于c# - MVVM动态DataGrid排序过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16200622/

10-11 00:56