来自事件处理程序的 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(() =&gt; ... set your properties ...); -- 我怀疑您在非 UI 线程上触发了事件处理程序。 某处我忘记了我在哪里看到 [Reactive] Fody 属性不应该在末尾有赋值。如果不是这样,也许有人可以添加,或者如果是这样,为什么不添加。您没有上面的视图绑定。是否要包含该代码? 感谢您的建议。使用 RxApp 调度程序不起作用。 @kenny 我已经用视图绑定更新了我最初的问题。 @K.L.看起来很完美。也许我不清楚,我不记得我在哪里看到它,但你能在 get;setter > = "Laden..."; 哦,我读过了。我试过了,但没有用。 【参考方案1】:

我遇到了类似的问题。对我来说,解决方案不是异步调用 Task 方法。您是否尝试过此操作,因为您先调用 await 然后再调用它。也许这会导致问题。第一次调用 SetRaceProperties 方法时不使用 await。

【讨论】:

是的,我试过不等待方法,但没有帮助。

以上是关于来自事件处理程序的 ReactiveUI MVVM 更新属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVVM 帮助器的视图模型中的 Xamarin 事件处理程序

遵循 MVVM 模式在 WPF 应用程序中处理导航的最佳方法是啥?

常用的MVVM框架

extjs6学习笔记1.2 初始:MVC MVVM

WPF MVVM:如何根据事件更新 UI 控制器

如何将 RShiny reactiveFileReader 与 reactiveUI 和不存在的文件一起使用?