Обновление элементов пользовательского интерфейса в 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 изменения, вносимые в БД, не наблюдаются ни клиентом (ни фактически уровнем сервера). Никакая система уведомлений, основанная на клиенте, не исправит это.

Посмотрите здесь и на этот пост, чтобы узнать, как решить ваши требования.

Другие вопросы по тегам