Допустим, у вас есть класс ViewModel со свойством под названием «клиенты», которое представляет собой список клиентов. 3 вещи можно изменить:
- Свойство customer в вашей модели представления (то есть вы меняете весь список следующим образом: this.customers = new list
- Вы добавляете или удаляете элементы в или из списка.
- Изменение свойства конкретного клиента, уже имеющегося в списке (например, клиенты [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>
Теперь вам просто нужно синхронизировать коллекцию клиентов с коллекцией на сервере. Любые изменения, внесенные вами в клиента, будут отражены в пользовательском интерфейсе.