0

我正在使用 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}" />

我在这里做错了吗?

提前致谢!

4

1 回答 1

0

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

于 2021-08-29T16:33:52.740 回答