来自事件处理程序的 ReactiveUI MVVM 更新属性
Posted
技术标签:
【中文标题】来自事件处理程序的 ReactiveUI MVVM 更新属性【英文标题】:ReactiveUI MVVM update property from event handler 【发布时间】:2021-10-28 14:32:38 【问题描述】:我正在使用 DDD 原则构建一个小型 MVVM 应用程序。 在我的 ViewModel 中,每当触发事件时,我都必须更新一些属性。 尽管我的 ViewModel 更新了属性,但这些更改并未反映在 UI 中。
这是我的(简化的)ViewModel:
public class DashboardViewModel : ReactiveObject, IAsyncHandle<RaceCreatedEvent>
private readonly IQueryHandler<Query.Races.RaceQuery, Query.Races.Race?> raceQueryHandler;
public DashboardViewModel(IQueryHandler<Query.Races.RaceQuery, Query.Races.Race?> raceQueryHandler)
this.raceQueryHandler = raceQueryHandler;
// Here the method updates the properties & UI is updated
SetRaceProperties();
[Reactive]
public string NumberOfRaces get; set;
[Reactive]
public string NumberOfFinishedRaces get; set;
[Reactive]
public string NumberOfPendingRaces get; set;
// Whenever a 'RaceCreatedEvent' has fired, this method is executed
public async Task HandleAsync(RaceCreatedEvent domainEvent)
// Here the method updates the properties, but the UI is NOT updated
await SetRaceProperties();
private async Task SetRaceProperties()
var data = await raceQueryHandler.HandleMultipleAsync(null);
this.NumberOfRaces = $"data.Count() aangemaakte races";
this.NumberOfPendingRaces = $"data.Where(r => r != null && !r.Finished && !r.Started).Count() races in afwachting";
this.NumberOfFinishedRaces = $"data.Where(r => r != null && r.Finished).Count() afgelopen races";
当从构造函数调用SetRaceProperties
时,属性和UI 会更新。
每当我的事件处理程序触发 SetRaceProperties
方法时,属性都会更新,但 UI 不会更新。
这是我的视图绑定:
<TextBlock Margin="5,0,5,0" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="1" Classes="Body1" Text="Binding NumberOfRaces" />
<TextBlock Margin="5,0,5,0" HorizontalAlignment="Left" Grid.Row="1" Grid.Column="1" Classes="Body1" Text="Binding NumberOfPendingRaces" />
<TextBlock Margin="5,0,5,0" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="1" Classes="Body1" Text="Binding NumberOfFinishedRaces" />
我在这里做错了吗?
提前致谢!
【问题讨论】:
使用 RxUI,您可以执行RxApp.MainThreadScheduler.Schedule(() => ... set your properties ...);
-- 我怀疑您在非 UI 线程上触发了事件处理程序。
某处我忘记了我在哪里看到 [Reactive] Fody 属性不应该在末尾有赋值。如果不是这样,也许有人可以添加,或者如果是这样,为什么不添加。您没有上面的视图绑定。是否要包含该代码?
感谢您的建议。使用 RxApp 调度程序不起作用。 @kenny 我已经用视图绑定更新了我最初的问题。
@K.L.看起来很完美。也许我不清楚,我不记得我在哪里看到它,但你能在 get;setter > = "Laden...";
哦,我读过了。我试过了,但没有用。
【参考方案1】:
我遇到了类似的问题。对我来说,解决方案不是异步调用 Task 方法。您是否尝试过此操作,因为您先调用 await 然后再调用它。也许这会导致问题。第一次调用 SetRaceProperties 方法时不使用 await。
【讨论】:
是的,我试过不等待方法,但没有帮助。以上是关于来自事件处理程序的 ReactiveUI MVVM 更新属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 MVVM 帮助器的视图模型中的 Xamarin 事件处理程序