Отслеживание изменений сущностей из модели представления - PullRequest
0 голосов
/ 17 января 2012

Я опробовал шаблон MVVM в WPF и использовал службу данных WCF для извлечения некоторых записей из базы данных (т. Е. Списка клиентов). Итак, из модели представления я звоню в определенную службу, которая запрашивает всех клиентов. Есть ли способ отслеживать изменения на объекте клиента при внесении изменений в него из вида? Что-то вроде EntityState.

Пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 17 января 2012

Вы можете реализовать свое собственное поведение отслеживания изменений на объектах.Если у вас есть несколько сущностей, для которых необходимо отслеживать изменения, я советую использовать общий базовый класс для реализации основных функций отслеживания изменений.

Но использование Entity Framework Self Tracking Entities также возможно.Уже есть многочисленные сообщения об использовании объектов STE vs poco (Plain Old Clr Objects).Смотрите здесь:

Введение в ADO.NET Entity Framework

STE против Poco

STE против Poco

0 голосов
/ 17 января 2012

Допустим, у вас есть класс ViewModel со свойством под названием «клиенты», которое представляет собой список клиентов. 3 вещи можно изменить:

  1. Свойство customer в вашей модели представления (то есть вы меняете весь список следующим образом: this.customers = new list
  2. Вы добавляете или удаляете элементы в или из списка.
  3. Изменение свойства конкретного клиента, уже имеющегося в списке (например, клиенты [0] .address = 'xxx';

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

Обойдите # 1, просто сказав, что ваша коллекция клиентов не может быть изменена. То есть вы выделяете список клиентов во время создания вашей ViewModel и не заменяете это свойство.

Для # 2 лучше всего повторно использовать объект .NET с именем ObservableCollection. Эта коллекция реализует INotifyPropertyChanged и генерирует правильное уведомление с правильным аргументом при вызовах Add, Remove, Clear и т. Д.

Для # 3 вам необходимо реализовать INotifyPropertyChanged для вашего объекта Customer. Например:

public class Customer : INotifyPropertyChanged
{
    public PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string name {
        get { return _name; }
        set { _name = value; ... /* add code to fire exception */ }
    }

    ... // more properties
}

Теперь, по вашему мнению, у модели есть наблюдаемая коллекция

public class ViewModel
{
    public ObservableCollection<Customer> customers { get; private set; }

    ViewModel( ) {
        // Allocate it once during construction
        customers = new Observablecollection<Customer>( )
    }
}

В пользовательском интерфейсе вам просто нужно привязать. Независимо от того, что вы используете ItemsControl:

<ItemsControl DataSource="{Binding customers}">
    <!-- The template to display the items here -->
</ItemControl>

Теперь вам просто нужно синхронизировать коллекцию клиентов с коллекцией на сервере. Любые изменения, внесенные вами в клиента, будут отражены в пользовательском интерфейсе.

0 голосов
/ 17 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...