Правильный способ аннулировать модель представления вовремя - PullRequest
0 голосов
/ 23 мая 2019

После небольшого исследования я не нашел решения, позволяющего аннулировать и повторно загружать данные моделей представления вовремя.

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

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

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

Как я сейчас вижу, используя диспетчер в модели представления:

    // ...
    public class Foo
    {
        public string Bar { get; set; }
        public int Baz { get; set; }

        // ...
    }

    // ...
    public interface IDataService
    {
        Task<Foo> GetDataAsync();
    }

    public class FooViewModel : INotifyPropertyChanged
    {
        private string _bar;
        public string Bar
        {
            get
            {
                return _bar;
            }
            set
            {
                _bar = value;
                OnPropertyChanged(nameof(Bar));
            }
        }

        private int _baz;
        public int Baz
        {
            get
            {
                return _baz;
            }
            set
            {
                _baz = value;
                OnPropertyChanged(nameof(Baz));
            }
        }

        IDataService service;
        DispatcherTimer dispatcherTimer;

        private async void dispatcherTimer_Tick(object sender, EventArgs eventArgs)
        {
            await InvalidateAndReloadDataAsync();
        }

        private void InitializeDispatcher()
        {
            dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 1, 0);
            dispatcherTimer.Start();
        }

        public async Task InvalidateAndReloadDataAsync()
        {
            Foo foo = await service.GetDataAsync();
            Bar = foo.Bar;
            Baz = foo.Baz;
        }

        public FooViewModel(IDataService dataService)
        {
            service = dataService;
            InitializeDispatcher();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName()] string name = null)
        {
            if (name != null) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        // ...

    }

нормально использовать диспетчер в модели представления или есть гораздо лучшее решение?

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