2

DataGrid介して数秒ごとにデータを更新する がありますThreadDataGrid列ヘッダーの並べ替え、グループ化、およびフィルタリングを提供する必要があります。

現在、 へのDataGridバインドがICollectionViewあり、 のソースはICollectionViewですObservableCollection。他のスレッドで読んだことから、これは良い方法のようです。

ソートは「機能」しますがICollectionView.Source、 の更新に続いて が更新されると失われますObservableCollection。更新前にを保存してSortDescriptions、更新後に に再度追加しようとしましICollectionViewた。でも同じ結果です。

誰かが私が欠けているものを教えてくれますか?

編集ここにいくつかのコードがあります...

表示 (XAML)

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

ビューモデル

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

2 に答える 2

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

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

フィルター ハンドラーを直接追加するために使用でき、[SortDescriptions追加/削除]で同じことができます。

[YourObservableCollection].ViewHandler.View.SortDescriptions.Add(mySortDescription);

SortDescriptionsCollectionViewSource をカプセル化する独自のクラスを作成し、追加と削除、フィルタリングなどを実装するために、並べ替えとフィルタリングの割り当てを最善に行っている場合

あなたが言う時:

並べ替えは「機能」しますが、ObservableCollection の更新に続いて ICollectionView.Source が更新されると失われます。

更新とはどういう意味ですか? ソースを変更しているということですか?コレクションにアイテムを追加/削除するのではなく?

追加した XAML の例に基づいて編集します。

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

データコンテキストをバインドする必要がある CollectionViewSource に itemsource をバインドしています。

例:

<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毎回ビューを更新する場所を返す場合、これらの値を一度だけ設定する必要があります

追加/削除する場合にのみ、ビューで更新を呼び出しますSortDescriptions

CollectionViewSourceの基本を理解する必要があると思います

于 2013-04-24T20:09:03.310 に答える