Как заставить двустороннюю привязку флажка на стороне клиента Blazor работать с моделью представления - PullRequest
0 голосов
/ 20 октября 2019

Мой флажок на стороне клиента Blazor работает только в одном направлении - от пользовательского интерфейса до модели представления, но не с другой стороны. У меня также есть приложение для Windows, использующее точно такую ​​же модель представления, где двусторонняя привязка работает идеально.

Модель представления помещается в отдельный проект, на который ссылаются как клиентское приложение Blazor, так иПриложение Windows.

Я реализовал интерфейс INotifyPropertyChanged в моей модели представления.

Наблюдаемое поведение:

  1. Когда я запускаю приложение Blazor, пользовательский интерфейс выполняетне отражать значение из представления модели и базы данных. Если я запускаю свое приложение Windows, это происходит.
  2. Если я изменяю значение в базе данных, пользовательский интерфейс моего приложения Windows будет обновляться в течение 30 секунд, но мой Blazor не будет.
  3. Если яустановите флажок в пользовательском интерфейсе, чтобы моя модель представления и база данных обновлялись как в Blazor, так и в приложении Windows.

Итак, что я делаю не так в клиентском приложении Blazor?

Мой вид Blazor довольно прост:

@using ViewModels
@inject IViewModel ViewModel

<div class="bordered">
    <input type="checkbox" name="chkbox1" @bind="@ViewModel.BooleanValue" />
    <label for="chkbox1">Boolean Value</label>
</div>

Мой режим просмотра:

namespace ViewModels
{
    public interface IViewModel : IViewModelBase
    {
        bool BooleanValue{ set; get; }
    }

    public class ViewModel : ViewModelBase, IViewModel
    {
        private bool booleanValue;
        private readonly IDomain domainLayer;

        public ViewModel(IDomain domainLayer)
        {
            this.domainLayer = domainLayer;
            PropertyChanged += HandleDomainLayerUpdateOnPropertyBooleanValueChanged;
            DomainModelChanged += HandleViewModelUpdateOnDomainModelChanged;
            OnDomainModelChanged();
            UpdateFromDomain();
        }

        // Function to make the system check for database changes every 30 seconds
        private void UpdateFromDomain()
        {
            Task.Run(async () =>
            {
                while (true)
                {
                    OnDomainModelChanged();
                    await Task.Delay(30000);
                }
            });
        }

        public bool BooleanValue
        {
            set
            {
                booleanValue= value;
                OnPropertyChanged("BooleanValue");
            }
            get { return booleanValue; }
        }

        private async void HandleDomainLayerUpdateOnPropertyBooleanValueChanged(object sender, EventArgs e)
        {
            await domainLayer.SetBooleanValueAsync(executed);
        }

        private async void HandleViewModelUpdateOnDomainModelChanged(object sender, EventArgs e)
        {
            BooleanValue = await domainLayer.GetBooleanValueAsync();
        }
    }
}
...