Привязка ItemsSource к коллекции прокси. Как получить DataContext? - PullRequest
1 голос
/ 16 июля 2009

У нас есть приложение Silverlight с несколькими списками и комбинированными списками, которые отображают данные, отсортированные неправильно, которые мне нужно исправить. Большинство их свойств ItemSource устанавливаются через XAML. Их DataContext не может быть установлен непосредственно на элементе управления, а вместо этого был установлен на родительском элементе. Поэтому я не могу с легкостью добавить «OrderBy» к назначению ItemSource или 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 для коллекции прокси? Или любые другие гениальные идеи?

Ответы [ 4 ]

1 голос
/ 29 июля 2009

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

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

По сути, у меня есть элемент управления SharedDataContext, он имеет DP-значение "Value", которое я привязываю к текстовому тексту напрямую.

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

Это делает XAML похожим на это

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

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

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

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

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

НТН

Simon

0 голосов
/ 09 декабря 2010

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

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

0 голосов
/ 29 июля 2009

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

0 голосов
/ 16 июля 2009

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

Не идеально, так как в сценарии типа MVVM это будет диктовать порядок сортировки для самого просмотра, потребляющего виртуальную машину.

...