Сортировка ListBox с привязкой кода MVVM - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть ListBox, который с радостью отображает данные, используя объект MVVM с выделенным кодом. Тем не менее, я хочу отсортировать записи, и поэтому я подумал, что промежуточный CollectionViewSource может работать. Но вместо этого программа вылетает при запуске.

Оригинальный экстракт xaml:

<ListBox SelectedItem="{Binding SelectedCategory}"
    DisplayMemberPath="name"
    ItemsSource="{Binding Categories}"
    Name="CategoriesListBox" />

Код для извлечения:

public class ViewModel : INotifyPropertyChanged
    {
        private trainCategory[] _categories;
        private trainCategory _selectedCategory;

        public event PropertyChangedEventHandler PropertyChanged;

        public trainCategory[] Categories
        {
            get { return _categories; }
            set
            {
                if (_categories == value)
                {
                    return;
                }
                _categories = value;
                RaisePropertyChanged("Categories");
            }
        } //etc

Замена XAML для ListBox:

<ListBox SelectedItem="{Binding SelectedCategory}"
    DisplayMemberPath="name"
    ItemsSource="{Binding Source={StaticResource SortedItems}}"
    Name="CategoriesListBox" />

И CollectionViewSource:

<CollectionViewSource x:Key="SortedItems" Source="{Binding Categories}">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="name"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

Мне кажется, что CollectionViewSource находится между моделью представления и ListBox, но это явно не так (или я сделал это неправильно). Любые указатели приветствуются.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Используйте свой исходный xaml

<ListBox SelectedItem="{Binding SelectedCategory}" 
    DisplayMemberPath="name" 
    ItemsSource="{Binding Categories}" 
    Name="CategoriesListBox" /> 

Обновите вашу модель представления, чтобы использовать вместо нее список:

   public List<trainCategory> _categories;
   public List<trainCategory> Categories 
    { 
        get 
        {   // This LINQ statement returns a sorted list
            return (from c in _categories
                    orderby c
                    select c);
        } 
        set 
        { 
            if (_categories == value) 
            { 
                return; 
            } 
            _categories = value; 
            RaisePropertyChanged("Categories"); 
        } 
    } //etc 

Тогда вы можете пропустить всю эту мерзость попыток привязать к статическому искажению,Просто привяжите пролив к свойству в вашей модели представления.

В качестве альтернативы вы все равно можете использовать массивы в качестве вспомогательной переменной в вашей модели представления:

   public trainCategory[] _categories;
   public List<trainCategory> Categories 
    { 
        get 
        {   // This LINQ statement returns a sorted list
            return (from c in _categories
                    orderby c
                    select c).ToList();
        } 
        set 
        { 
            if (_categories == value.ToArray()) 
            { 
                return; 
            } 
            _categories = value.ToArray();
            RaisePropertyChanged("Categories");
        } 
    } //etc 
1 голос
/ 29 сентября 2011

Какое исключение вы получаете при запуске?Не забудьте иметь свой раздел Resources перед всем другим кодом, который должен использовать ресурсы.

Альтернативой этому будет:

<ListBox SelectedItem="{Binding SelectedCategory}" DisplayMemberPath="name" Name="CategoriesListBox">
    <ListBox.ItemsSource>
        <Binding>
            <Binding.Source>
                <CollectionViewSource Source="{Binding Categories}">
                    <CollectionViewSource.SortDescriptions>
                        <scm:SortDescription PropertyName="name"/>
                    </CollectionViewSource.SortDescriptions>
                </CollectionViewSource>
            </Binding.Source>
        </Binding>
    </ListBox.ItemsSource>
</ListBox>

Также не забудьте иметь правильные xmlnsдекларация на scm в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...