Сортировка поля комбинированного списка просто в XAML

Я удивлен, что никто не спросил это прежде здесь... хорошо, по крайней мере, я не нашел ответ здесь или больше нигде на самом деле.

У меня есть ComboBox, который связан с данными к ObservableCollection. Все работавшее отлично, пока парни не хотели отсортированное содержание. Никакая проблема - я заканчиваю тем, что изменил простое свойство:

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

Это сообщение является действительно двумя вопросами в одном:

  1. Как я могу отсортировать простой ComboBox строк в XAML только. Я исследовал это и могу только найти информацию о классе SortDescription, и это - самая близкая реализация, которую я мог найти, но это не было для ComboBox.
  2. Как только я реализовал сортировку в коде - позади, это, моя привязка данных была повреждена; когда я добавил новые объекты к ObservableCollection, объекты ComboBox не обновили! Я не вижу, как это произошло, потому что я не присваивал имя к своему ComboBox и управлял им непосредственно, который является тем, что обычно повреждает привязку.

Спасибо за помощь!

24
задан Dave 16 February 2010 в 17:00
поделиться

1 ответ

Вы можете использовать CollectionViewSource для сортировки в XAML, однако вам необходимо обновить его представление, если базовая коллекция изменится.

XAML:

<Window x:Class="CBSortTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    Height="300" Width="300">

    <Window.Resources>
        <CollectionViewSource Source="{Binding Path=CandyNames}" x:Key="cvs">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>

    </Window.Resources>
    <StackPanel>
        <ComboBox ItemsSource="{Binding Source={StaticResource cvs}}" />
        <Button Content="Add" Click="OnAdd" />
    </StackPanel>
</Window>

Код позади:

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<string>();

            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<string> CandyNames { get; set; }

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

        private Random _random = new Random();
    }
}
17
ответ дан 29 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: