0

我在 Blazor 客户端的复选框仅以一种方式工作,从 UI 到视图模型,而不是另一种。我还有一个使用完全相同的视图模型的 Windows 应用程序,双向绑定可以完美地工作。

视图模型放置在一个单独的项目中,该项目同时被 Blazor 客户端应用程序和 Windows 应用程序引用。

我已经在我的视图模型中实现了 INotifyPropertyChanged 接口。

观察到的行为是:

  1. 当我启动我的 Blazor 应用程序时,UI 没有反映来自视图模型和数据库的值。如果我启动我的 Windows 应用程序,它会启动。
  2. 如果我更改数据库中的值,我的 Windows 应用程序 UI 将在 30 秒内更新,但我的 Blazor 不会。
  3. 如果我单击 UI 中的复选框,我的视图模型和数据库将在 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();
        }
    }
}
4

1 回答 1

0

为了让 UI 了解更改,BooleanValue您需要调用StateHasChanged()这将触发 UI 的呈现。

您提到您正在使用INotifyPropertyChanged,一种方法是在您的 Razor 页面代码中添加这一行。

ViewModel.PropertyChanged += (sender, args) => StateHasChanged();

然后,当您的视图模型属性发生更改时,将呈现对 UI 的更改。

于 2019-12-18T04:18:55.467 回答