Мой флажок на стороне клиента Blazor работает только в одном направлении - от пользовательского интерфейса до модели представления, но не с другой стороны. У меня также есть приложение для Windows, использующее точно такую же модель представления, где двусторонняя привязка работает идеально.
Модель представления помещается в отдельный проект, на который ссылаются как клиентское приложение Blazor, так иПриложение Windows.
Я реализовал интерфейс INotifyPropertyChanged в моей модели представления.
Наблюдаемое поведение:
- Когда я запускаю приложение Blazor, пользовательский интерфейс выполняетне отражать значение из представления модели и базы данных. Если я запускаю свое приложение Windows, это происходит.
- Если я изменяю значение в базе данных, пользовательский интерфейс моего приложения Windows будет обновляться в течение 30 секунд, но мой Blazor не будет.
- Если яустановите флажок в пользовательском интерфейсе, чтобы моя модель представления и база данных обновлялись как в 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();
}
}
}