1

最初にコード(100%ではない場合は申し訳ありません)私は専門家ではありません。次に質問が続きます。

    public partial class Window1 : Window
    {
    CollectionView cv;

    public Window1()
    {
        InitializeComponent();

        List<Person> ppl = new List<Person>();
        BitmapImage b = new BitmapImage(new Uri(@"http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png",UriKind.Absolute));
        ppl.Add(new Person(b, "world1"));
        ppl.Add(new Person(b, "world2"));
        ppl.Add(new Person(b, "world3"));
        ppl.Add(new Person(b, "world4"));
        ppl.Add(new Person(b, "world5"));
        ppl.Add(new Person(b, "world6"));

        lb.ItemsSource = ppl;
        lb.SelectedIndex = 1;

        cv = (CollectionView)CollectionViewSource.GetDefaultView(lb.ItemsSource);

        new TextSearchFilter(cv, textBox1);
    }
}

public class TextSearchFilter
{
    public TextSearchFilter(CollectionView cv, TextBox tb)
    {
        string filterText = "";

        cv.Filter = delegate(object obj)
        {
            Person p = obj as Person;
            int index = p.Info.IndexOf(filterText,0,StringComparison.InvariantCultureIgnoreCase);
            return index > -1;
        };

        tb.TextChanged += delegate
        {
            filterText = tb.Text;
            cv.Refresh();
        };
    }
}

    class Person
    {
        private BitmapImage myImage;
        private string myInfo = "";

        public BitmapImage Image
        {
            get { return myImage; }
            set { myImage = value; }
        }

        public string Info
        {
            get { return myInfo; }
            set { myInfo = value; }
        }

        public Person(BitmapImage Image, string Info)
        {
            this.Image = Image;
            this.Info = Info;
        }
    }

ここまで読んでくれてありがとう。コードがテキストボックスの入力に基づいてリストボックスをフィルター処理することは理解できたでしょうが、これは魔法のように機能します。

私の問題は、フィルタリング中に選択を保持する方法です。ウィンドウが読み込まれると、リストボックスにすべてのアイテムが含まれ、最初のアイテムを選択します。次に、テキストボックスに何かを入力し、リストボックスフィルターで関連するアイテムのみを表示します。別のアイテムを選択した後、テキストからすべてのテキストを削除します元の状態に戻すボックスですが、今回はフィルター ビューで選択したアイテムのみに選択が変更されました (したがって、2 つのアイテムが選択されていると表示されるのではなく、1 つだけが選択されていると表示されます)。コレクションをフィルタリングしているので、この動作は明らかであるため、コレクションが変更された瞬間に選択が失われます。

選択を保持する方法はありますか?ポインタはありますか?

どうもありがとう。

4

2 に答える 2

1

おそらく TextChanged イベント ハンドラーで、次のように ListBox の選択された項目を保存する必要があります。

Person[] selectedPeople = new Person[lb.SelectedItems.Count];
lb.SelectedItems.CopyTo(selectedPeople, 0);

次に、フィルターを更新した後、次を使用してフィルターを追加し直します。

foreach (Person p in selectedPeople)
{
    if(lb.Items.Contains(p))
    {
        lb.SelectedItems.Add(p);
    }
}

単に使用するのではなく、CopyTo を使用して配列に保存する理由:

IList selectedPeople = lb.SelectedItems;

後者は lb.SelectedItems への参照を保持するだけで、foreach が列挙を変更し、例外がスローされます。もっと簡単な方法があるかもしれませんが、これで正しい方向に向かうはずです。

于 2009-04-08T15:46:24.080 に答える
0

私の推測では、フィルターは監視可能なコレクション内のアイテムを挿入、削除、および再配置します。を一時的に削除して別の場所に挿入すると、WPF は SelectedItem を途中で null に設定します。その後、再度追加すると、選択されなくなります。

リスト ボックスにアタッチできるビヘイビアという形での回避策を次に示します。

http://www.codeproject.com/Tips/802806/Preserve-the-Selected-Item-of-a-WPF-List-Box

于 2014-08-01T16:42:52.693 に答える