Применение MVVM к ItemsControl, заполненному UserControls - PullRequest
2 голосов
/ 04 января 2010

По мере того, как я устраняю все больше и больше проблем, связанных с MVVM, с моим текущим приложением, все больше и больше появляются.:)

Текущая реализация, которую я пытаюсь заменить, включает в себя StackPanel, чьи дочерние элементы генерируются более или менее динамически (путем просмотра файла конфигурации).Каждый дочерний элемент является экземпляром UserControl.Раньше я назначал имя StackPanel, а затем в обработчике событий Window_Loaded я просто определял необходимое количество дочерних элементов, создавал по одному UserControl для каждого, а также назначал UserControl ID, чтобы я зналправильный источник для кнопок, нажимаемых на конкретный экземпляр UserControl;Каждый UserControl имеет 3 кнопки.

Так что я знаю, что хочу связать StackPanel с коллекцией.Это, конечно, невозможно, так как мне нужно использовать что-то, производное от ItemsControl, например ListBox или ListView (или даже самого ItemsControl).Чтобы было проще в первой итерации MVVM-ifying, я просто буду использовать ListBox.

Теперь вопрос в том, должен ли мой ObservableCollection в коде позади быть ObservableCollection?Я считаю, что это означает, что независимо от того, как я работаю со своим графическим интерфейсом, в этом ListBox всегда будут дочерние элементы, которые выглядят так же, как и в файле XAML MyUserControl.Я бы хотел, чтобы это также можно было настраивать, но я предполагаю, что это означает, что мне нужно применить шаблон MVVM и к UserControl.

Ответы [ 2 ]

5 голосов
/ 04 января 2010

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

Ваш основной вид может иметь привязку ListBox к наблюдаемой коллекции экземпляров модели представления. Если вы настраиваете свои шаблоны данных для сопоставления классов ViewModel с их соответствующим UserControl, вам больше не нужно явно загружать UserControls - просто привяжите любой ItemsControl к вашей коллекции ViewModels, и пусть шаблоны данных позаботятся о создании и отображении этого в правильный UserControl для этой виртуальной машины.

1 голос
/ 04 января 2010

Ваша коллекция не должна быть ObservableCollection, если она не обязательна. «Наблюдаемая» часть ObservableCollection - это просто вопрос предоставления событий для уведомления других о том, что коллекция изменилась, она никоим образом не связана с визуальным представлением.

ObservableCollection очень хорошо подходит для MVVM из-за всех уведомлений о событиях, которые он предоставляет, но, в конечном счете, независимо от того, используете ли вы List<T> или ObservableCollection<T>, нет никакой разницы в том, как все выглядит визуально в любой заданной точке время.

...