2012-04-20 4 views
3

Я новичок в WPF и MVVM, и много борюсь с тем, как проектировать мое приложение (отсюда много вопросов здесь), и я собираюсь сделать рефактор. У меня есть SQL-сервер и я использую LINQtoSQL, поэтому классы, которые генерирует LINQTOSQL, будут моей моделью. Мне еще предстоит увидеть хороший исчерпывающий пример того, как убрать классы модели от представления - в примере, который я сейчас рассматриваю, представление является привязкой к ModelClass.Something вместо свойства ViewModel, которое ссылается на ModelClass.Something. Правильно ли я полагаю, что это плохо (если это поле изменилось в db, просмотр перерывов)?Проблемы с шаблоном проектирования MVVM

То, с чем я сейчас борюсь, - это выпадающие списки. Пример. У меня есть таблица поиска с именем MessageType с идентификатором и текстовым полем и метод репозитория для их извлечения. Поэтому, на мой взгляд, я хочу избежать привязки пути DisplayMemberPath и SelectedValue к полям класса MessageType моего Model, поэтому мне нужно создать новый класс и показать свойства этого класса в моей модели ViewModel? Как это:

public class MessageTypeViewModel : ViewModelBase 
{ 
    public MessageTypeViewModel(MessageType t) 
    { 
     MessageTypeText = t.messageTypeText; 
     MessageTypeId = t.messageTypeId; 
    } 
    public string MessageTypeText { get; private set; }//bind DisplayMember and SelectedValue to these properties 
    public int MessageTypeId { get; private set; } 
} 

заселение так:

get 
{ 
if (textMessageSelectionOptions == null) 
    { 
     var list = repository.GetMessageTypes().Select(x=>new MessageTypeViewModel(x)).ToList(); 
     textMessageSelectionOptions =new ReadOnlyCollection<MessageTypeViewModel>(list); 
    } 
return textMessageSelectionOptions; 
} 

Также я объект Mission, которая имеет внешний ключ MessageType так как я связать SelectedItem поле со списком, чтобы mission.MessageType, учитывая, что I теперь этот новый класс? Я действительно пытаюсь получить шаблон с объектом миссии, его детьми и его родителями, и я не могу найти исчерпывающих примеров, когда люди делают операции CRUD с MVVM. Я иду сверху или что-то не хватает?

+0

Если ваша модель взгляда не добавляет поведения к классу (например, реализация 'INotifyPropertyChanged' или команда/свойство для представления), то я бы не обернул ее в модель представления - это просто приводит к ненужному обслуживанию. –

ответ

3

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

Если вы хотите, чтобы вы полностью не подвергли модель просмотру, вам, вероятно, придется создать конкретную версию вашей модели с ViewModel и реплицировать все зависимости (например, Mission -> MessageType) re на нем.

Возможно, эта статья вам полезна: http://msdn.microsoft.com/en-us/magazine/ff798279.aspx, особенно раздел о коллекциях.

+0

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

1

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

Предполагаете, что вы работаете с представлением, которое связано с чем-то вроде MissionViewModel, и есть выпадающее меню, которое вы хотите заполнить с помощью MessageType параметров, привязанных к свойству, для которого вы показали получателя, я думаю, что вы делаете Это хорошо.

Пополнение раскрывающегося списка объектами MessageType (путем привязки к ItemsSource) должно по умолчанию отображать результат вызова ToString() по каждому элементу. Если это не даст вам желаемых результатов, вы можете пойти с моделью представлений или, возможно, создать реализацию IValueConverter, чтобы отображать то, что вы хотите.

Если у вас есть вид-модель в вашем раскрывающемся списке вместо MessageType самих объектов, то вы можете связать mission.MessageType к SelectedItem с помощью IValueConverter для преобразования вида-модели для MessageType. Чтобы выполнить это преобразование, вы можете

A. обнажить лежащий в основе MessageType в качестве публичной собственности вида-модели,
B. сделать сам вид-модель реализации IValueConverter поэтому операция преобразования может получить доступ к частному MessageType поле, или
C. создать IValueConverter в виде вложенного класса вида-модели, опять же, чтобы он мог получить доступ к закрытому MessageType поле

Один недостаток варианта в том, что вам нужен открытый конструктор без параметров, чтобы добавить конвертер в XAML ResourceDictionary.

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