Обновление элементов пользовательского интерфейса в WPF MVVM
Я новичок в WPF и MVVM (PRISM) (Java - моя специальность), однако я создал веб-сервис, который взаимодействует с моей базой данных, причем все вызовы веб-сервисов обрабатываются моим классом ViewModel.
До сих пор я пробовал ряд возможных решений, которые заключаются в следующем:
- Наблюдаемые коллекции
- Реализация INotifyPropertyChanged
- Реализация OnPropertyChanged
Несмотря на мои усилия, ни одно из этих решений не помогло мне.
Одно из решений, которое мне удалось выяснить, хотя и неудовлетворительно, заключалось в создании объекта TimerDispacher для выполнения всех вызовов веб-служб в ViewModel с интервалом один раз в секунду, но я уверен, что это не лучший способ сделать это.
Это может быть даже хуже, потому что я хочу, чтобы интерфейс реагировал на изменения базы данных.
Вот пример кода логики в моем классе ViewModel и, пожалуйста, скажите мне, где я ошибся:
public class MyViewModel : ViewModelBase {
private ObservableCollection<SomeClass> _listeData;
public ObservableCollection<SomeClass> ListeData {
set {
_listeData= value;
OnPropertyChanged("ListeData");
}
get { return _listeData; }
}
private string _textData;
public string TextData {
get { return _textData; }
set {
_textData = value;
OnPropertyChanged("TextData");
}
}
//Ctor
protected internal MyViewModel ( ) {
InitData();
SetTimer();
}
public void InitData() {
GetTextData();
GetListeData();
}
protected void GetTextData(string param) {
using (var proxy = new WCFServiceClient()) {
TextData = proxy.GetTextData(param);
}
}
protected void GetListeData(string param) {
using (var proxy = new WCFServiceClient()) {
ListeData = new ObservableCollection<SomeClass> (proxy.GetListeData(param));
}
}
protected void dispatcherTimer_Tick(object sender, EventArgs e) {
InitData();
}
private void SetTimer() {
var dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
dispatcherTimer.Start();
}
}
Примечание: я хочу, чтобы мой код максимально использовал функциональные возможности WPF и не зависел от решений на основе таймера.
1 ответ
Интерфейс WCF, встроенный в ваше приложение, разделяет уровни клиента и сервера / БД. Через обычный WCF изменения, вносимые в БД, не наблюдаются ни клиентом (ни фактически уровнем сервера). Никакая система уведомлений, основанная на клиенте, не исправит это.
Посмотрите здесь и на этот пост, чтобы узнать, как решить ваши требования.