0

CollectionViewから派生したものがありObservableCollectionます:

private static ObservableCollection<CalculationViewModel> _calculations;

CalculationViewModelsCollection = (CollectionView)CollectionViewSource.GetDefaultView(_calculations);

私の問題は、フィルターの結果が何もない場合、フィルターをクリアし、他の条件で再フィルターしたいのですが、CollectionView常に空です。

これらの方法でフィルターをリセットしようとしました:

CalculationViewModelsCollection.Filter = null;
CalculationViewModelsCollection.Refresh();

CalculationViewModelsCollection.Filter = delegate(object p)
{
    return true;
};

しかし、どれも機能しませんでした。

のフィルターをリセットする方法についてアドバイスをいただけますCollectionViewか?

4

2 に答える 2

4

あなたの例から、どのように CollectionView を取得しているか完全にはわかりません。また、あなたの質問を正しく理解しているとは確信していません。

とにかく、以下のサンプル コードが問題の解決に役立つことを願っています。文字列を含むリストボックスと「フィルター」テキストボックスを持つアプリです。リスト内にフィルターに一致するものがない場合、フィルターは null に設定され、すべての項目が表示されます。

XAML:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:WpfApplication3"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBox x:Name="textBox" TextChanged="TextBox_TextChanged"/>        
        <ListBox x:Name="listBox"/>
    </StackPanel>
</Window>

分離コード:

public partial class MainWindow : Window
{
    ListCollectionView lcv;
    Predicate<object> filterFx;

    public MainWindow()
    {
        InitializeComponent();

        ObservableCollection<string> s = new ObservableCollection<string>();
        "The Quick Brown Fox Jumps Over The Lazy Dog"
            .Split(' ')
            .ToList()
            .ForEach((word) => s.Add(word.ToString()));

        this.lcv = new ListCollectionView(s);
        this.listBox.ItemsSource = this.lcv;

        this.filterFx = (p) => ((string)p).ToUpper().Contains(this.textBox.Text.ToUpper());
        lcv.Filter = this.filterFx;
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        lcv.Refresh();

        if (lcv.Count == 0)
            lcv.Filter = null;
        else
            lcv.Filter = filterFx;
    }
}
于 2010-08-19T15:06:54.653 に答える
1

私は大きな拘束ミスをしました。それがどのように機能するのか全くわかりません。

つまり、問題は、フィルターをリセットするのは簡単で、値をnullに設定するだけです。

もう1つあります。私はあなたがしたようにListCollectionViewを作成しようとしました。

this.lcv = new ListCollectionView(s);

しかし、フィルターが機能せず、CollectionViewにSortDescriptionを追加できませんでした。

この方法でCollectionViewを作成します。

this.lcv = (CollectionView)CollectionViewSource.GetDefaultView(s);

そして、すべてが正常に動作します。しかし、理想的にはあなたのテクニックも機能しなければなりません。

于 2010-08-19T18:48:15.537 に答える