1

У нас есть приложение Silverlight с несколькими списками и comboboxes, которые отображают данные, отсортированные неправильно, что мне нужно исправить. Большинство их свойств ItemSource устанавливаются через XAML. Их DataContext не может быть установлен непосредственно в элементе управления, а вместо этого установлен на родителя. Поэтому я не могу просто пощекотать «OrderBy» в назначении ItemSource или DataContext в коде позади, поскольку это назначение может явно не существовать.Binding ItemsSource для коллекции "proxy". Как получить DataContext?

У меня возникла идея создать «прокси-коллекцию». Коллекция прокси получит исходный ItemSource и выставит отсортированную версию. Я бы тогда быть в состоянии преобразовать это:

<ListBox ItemsSource="{Binding}"/> 

в этом:

<ListBox> 
    <ListBox.ItemsSource> 
     <my:ProxyCollection Source="{Binding}" SortBy="Name"/> 
    </ListBox.ItemsSource> 
</ListBox> 

Не хилые! Но поскольку ProxyCollection не является дочерним элементом ListBox, DataContext ListBox не распространяется на него, и привязка не работает магически. Если я вручную установил DataContext коллекции ProxyCollection, он отлично работает. Но если мне нужно вручную установить DataContext, я могу просто удалить коллекцию прокси и вручную установить DataContext Listbox, добавив «OrderBy».

Итак, любые идеи о том, как я могу автоматически получить DataContext ListBox в коллекции прокси? Или любые другие гениальные идеи?

ответ

0

Учитывая, что контекст данных задается родительским, если поле списка привязано к свойству класса, заданного как контекст данных - это свойство будет отображаться как get/set, и вы могли бы сознательно вывести данные из свойства сортированным образом.

Не идеально, в том, что в сценарии типа MVVM, который будет диктовать порядок сортировки, чтобы, однако, очень сильно учитывать потребление VM.

1

Я наткнулся на очень похожую проблему. Я хотел каскад параметров из одного выпадающего списка в последующем выпадающий список с тем же целью дизайна без кода ....

Моего решения едва ли элегантно, но он работает в моде :)

В принципе у меня есть SharedDataContext, у этого есть «значение» DP i напрямую привязывается к datacontext.

Затем я использую присоединенное свойство в контексте общих данных, чтобы разрешить регистрацию других элементов.

Это делает XAML выглядеть как этот

<my:SharedDataContext Value="{Binding}" /> 
<ComboBox> 
    <ComboBox.ItemsSource> 
     <my:ProxyCollection my:SharedDataContext.Register="1" />  
    </ComboBox.ItemsSource> 
</ComboBox> 

Внутри SharedDataContext У меня есть статическая коллекция элементов каркаса.

Когда «Прикрепленное» хранилище «изменено», я перехватываю PropertyChangedCallback и добавляю отправителя (в данном случае экземпляр ProxyCollection) к коллекции.

Когда привязка данных изменяется (и, следовательно, свойство Value SharedDataContext), я перечисляю коллекцию и устанавливаю привязки данных.

Это немного работа, и я не на 100% доволен ею (вещи, подобные очистке коллекции, касаются меня немного), но я надеюсь, что это даст вам некоторые идеи.

НТН

Simon

0

я в конечном итоге решать мою проблему с другого маршрута. Я создал, например, элемент «SortedComboBox», который был получен из стандартного ComboBox. Он определил свой собственный ItemSource, и когда его ItemSource изменил его, он сортирует элементы, а затем устанавливает ItemSource в базовом классе. Он работает достаточно хорошо и требует лишь немного изменений XAML, чтобы получить желаемый эффект.

0

Вы можете использовать IValueConverter и преобразовать свой неупорядоченный список в упорядоченный. Вы можете использовать параметр преобразователя, чтобы указать порядок заказа.

Легко, чисто, MVVM приветствуется, и вы можете использовать его для любой коллекции, связанной с любым управлением :)

Смежные вопросы