24


4

XAMLのみでコンボボックスを並べ替える

ここまで誰もこれを聞いたことがないことに驚いています…​ まあ、少なくとも私は実際、ここでも他のどこでも答えを見つけていません。

ObservableCollectionにデータバインドされたComboBoxがあります。 みんながコンテンツを並べ替えるまで、すべてがうまくいきました。 問題ありません-単純なプロパティを変更することになります:

public ObservableCollection CandyNames { get; set; } // instantiated in constructor

このような何かのために:

private ObservableCollection _candy_names; // instantiated in constructor
public ObservableCollection CandyNames
{
    get {
        _candy_names = new ObservableCollection(_candy_names.OrderBy( i => i));
        return _candy_names;
    }
    set {
        _candy_names = value;
    }
}

この投稿は実際には2つの質問です。

  1. XAML * only *で文字列の単純なComboBoxを並べ替えるにはどうすればよいですか。 私は持っています これを調査し、SortDescriptionクラスに関する情報のみを見つけることができます。http://www.galasoft.ch/mydotnet/articles/article-2007081301.aspx [これは私が見つけることができる最も近い実装です]が、コンボボックス。

  2. コードビハインドで並べ替えを実装すると、データバインディングは 壊れた; ObservableCollectionに新しいアイテムを追加しても、ComboBoxアイテムは更新されませんでした。 ComboBoxに名前を割り当てて直接操作しなかったため、どのように発生したのかわかりません。これは通常、バインディングを壊します。

ご協力いただきありがとうございます!

1 Answer


17


CollectionViewSourceを使用してXAMLで並べ替えを実行できますが、基になるコレクションが変更された場合はビューを更新する必要があります。

XAML:


コードビハインド:

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Data;

namespace CBSortTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            CandyNames = new ObservableCollection();

            OnAdd(this, null);
            OnAdd(this, null);
            OnAdd(this, null);
            OnAdd(this, null);

            DataContext = this;

            CandyNames.CollectionChanged +=
                (sender, e) =>
                {
                    CollectionViewSource viewSource =
                        FindResource("cvs") as CollectionViewSource;
                    viewSource.View.Refresh();
                };
        }

        public ObservableCollection CandyNames { get; set; }

        private void OnAdd(object sender, RoutedEventArgs e)
        {
            CandyNames.Add("Candy " + _random.Next(100));
        }

        private Random _random = new Random();
    }
}