2014-10-22 5 views
2

В настоящее время у меня три модели в EF (House, Room, Item).Связь MVVM между режимами просмотра с различными DTO

public class House 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<Room> Rooms { get; set; } 
} 

public class Room 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<Item> Items { get; set; } 
} 

public class Item 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
} 

В моем UI У меня есть Treeview и область отображения, чтобы показать пункты, дополнительные детали для модификации, когда я дважды щелкните элемент в TreeView.

Мой TreeView для повышения производительности вызывает WebService, который возвращает следующие DTO/с

public class LayoutItemDTO 
{ 
    property int ID { get; set; } 
    property string Name { get; set; } 
    property List<LayoutItemDTO> Children { get; set; } 
} 

эти DTO-х сопоставляются построены с помощью запроса к базе данных по модели дома, комнаты, пункт.

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

То же самое происходит, когда пользователь дважды щелкает по комнате (например, добавляет/удаляет предметы в комнату).

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

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

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

ответ

0

Databinding и INotifyPropertyChanged

Если вы хотите, чтобы изменения на ваши объекты должны быть отражены в пользовательском интерфейсе с помощью связывания данных, вы должны реализовать INotifyPropertyChanged интерфейс в вашем классе модели (или в ViewModel, если вы используете MVVM).

При реализации интерфейса событие события (PropertyChanged) будет запускаться каждый раз при изменении значения свойства, а элементы управления, привязанные к свойствам, будут обновляться, чтобы отображать новые значения.

Вы можете найти пример здесь: How to: Implement the INotifyPropertyChanged Interface

Коллекции

Для коллекции, WPF привязки будет работать, если коллекция реализует INotifyCollectionChanged. Тип List<T> не реализует этот интерфейс, поэтому TreeView не будет отражать добавление/удаление из списка. Тип ObservableCollection<T> реализует этот интерфейс, поэтому вам просто нужно изменить List<LayoutItemDTO> на ObservableCollection<LayoutItemDTO>, и изменения должны быть отражены.

MVVM

Как вы упомянули, используя MVVM, я хотел бы добавить, что я обычно бы ObservableCollection и INotifyPropertyChanged реализации в моих ViewModels.Возможно, вы захотите создать LayoutItemViewModel, который будет инкапсулировать LayoutItemDTO.

Я также могу посоветовать вам ознакомиться с существующими наборами инструментов и фреймворками, которые могут помочь в реализации «сантехнического кода» для MVVM (например, реализация INotifyPropertyChanged). Я использую в основном MVVM Light, но есть много других доступных в зависимости от ваших потребностей.

Здесь также хорошая ссылка для реализации TreeView привязки данных в MVVM образом: Simplifying the WPF TreeView by Using the ViewModel Pattern

+0

Привет спасибо за ответ мы имеем ViewModels для этих DTO-х годов так TreeView имеет layoutviewmodel и вид, когда это открыто имеет houseviewmodel с вложенными режимами просмотра для комнат и элементами, которые они построены после того, как пользователь дважды щелкнул по дереву, и второй вызов службы был сделан. Проблема возникает, когда мы меняем любой из этих элементов в древовидной структуре или в открытое представление с разными режимами просмотра позади них. Нам нужен способ как-то иметь общую взаимосвязанную модель обзора между двумя – jclarkson

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