我在 Blazor 客户端的复选框仅以一种方式工作,从 UI 到视图模型,而不是另一种。我还有一个使用完全相同的视图模型的 Windows 应用程序,双向绑定可以完美地工作。
视图模型放置在一个单独的项目中,该项目同时被 Blazor 客户端应用程序和 Windows 应用程序引用。
我已经在我的视图模型中实现了 INotifyPropertyChanged 接口。
观察到的行为是:
- 当我启动我的 Blazor 应用程序时,UI 没有反映来自视图模型和数据库的值。如果我启动我的 Windows 应用程序,它会启动。
- 如果我更改数据库中的值,我的 Windows 应用程序 UI 将在 30 秒内更新,但我的 Blazor 不会。
- 如果我单击 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();
}
}
}