2010-01-04 3 views
2

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

Текущая реализация, которую я пытаюсь заменить, включает в себя 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.

ответ

5

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

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

+0

Мне не нужно, чтобы каждый ListItem имел другой шаблон, но я определенно хочу придерживаться стиля MVVM. Оказывается, я не могу делать все, что я предложил, так как этот UserControl уже ссылается на ViewModel, и поэтому я получаю круговую ссылку. Я дам, что ViewModel подходит к выстрелу и посмотрит, где он меня принимает. Благодаря! – Dave

+0

Да. Каждый элемент может быть отдельным классом ViewModel, что означает, что он получит свой собственный шаблон (если у вас есть настройка DataTemplate для каждого ViewModel, чтобы сопоставить его с соответствующим представлением). Это может быть отдельный UserControl. Я делаю это все время - это в основном делает его списком виртуальных машин, полностью отделенным от представлений - чистым MVVM :) –

+0

Я ушел в сторону, просто пытаясь помочь кому-то в форуме Expression Blend, но я собираюсь изучить этот метод «привязки» виртуальной машины к V с использованием DataTemplates. Это не то, что я делал раньше, или даже слышал. Мне просто нравится пытаться применить MVVM - я нахожу, что я изучаю намного больше о WPF через этот процесс! Благодарим за ваше предложение! – Dave

1

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

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

+0

Спасибо за разъяснение относительно ObservableCollections. просто используйте его для привязки какой-либо коллекции, но вы напомнили мне, что это в основном для уведомления об изменениях. В моем приложении у меня действительно нет содержимого ComboBoxes и тому подобное, динамически меняющегося - они заполняются один раз только через databinding, так что, возможно, мне стоит вернуться и изменить их на что-то с (возможно) меньшими накладными расходами? – Dave

+0

@D. Matsumoto: Если вы ЗНАЕТЕ, что элементы никогда не будут меняться, вы можете просто использовать Список - но если вы можете , в какой-то момент, решите добавить/удалить элементы из вашего списка, я бы просто использовал ObservableCollection . Большая часть «накладных расходов» - это действительно только проблема, когда вещи ch ange, и в этом случае вам нужны дополнительные накладные расходы. –

+0

Не ломайте MVVM из-за боязни возможных накладных расходов. Преждевременная оптимизация ... –