XAML Maui与CommunityToolkit ObservableProperty在处理时未更新

uyhoqukh  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(232)

我有一个毛伊岛应用程序只运行在Android(斑马扫描枪)。
当我点击屏幕上的一个按钮时,运行的进程可能需要30秒才能完成。在这30秒内,我更新ObservableProperty的值,以便在处理继续时向用户给予更新。目前,结果是UI在将控制返回到屏幕之前不会刷新。
当我使用CommunityToolkit.Mvvm时,SetProperty由内部代码调用,我希望它刷新UI。
下面是一些相关代码:

using CommunityToolkit.Mvvm.ComponentModel;
    using CommunityToolkit.Mvvm.Input;
    namespace myNamespace 
    {
       public partical class MyClassVM: ObservableObject
       {
            [ObservableProperty]
            string status;
    
            [RelayCommand]
            void DoStuff()
            {
              var myUseCase = new DoStuffUseCase();
              myUseCase.Execute(UpdateStatus)
            }
    
            public void UpdateStatus(string text, bool isThreadRunning)
            {
                Status = text;
            }
       }
    }

下面是我的Execute用例的定义:

public void Execute(Action<string, bool> callback)
    {
        callback("Begin", true);
        // do stuff which sometimes takes a few seconds
        callback("End", false);
    }

下面是我XAML:

<Label x:Name="lblStatus" 
               Text="{Binding Status}" 
               HorizontalTextAlignment="Center" 
               FontSize="20" 
               TextColor="DarkRed" 
               FontAttributes="Bold" 
               Margin="0,20,0,0"/>

结果是用户永远看不到“开始”消息。只有在过程完成后的结束消息。

dxxyhpgq

dxxyhpgq1#

您可以尝试为函数Execute添加async-await
根据你的代码,我做了一个测试,它在我这边工作正常。
请参考以下代码:

public partial class MyClassVM: ObservableObject
{
    [ObservableProperty]
    string status;

    //[RelayCommand]
    public MyClassVM()
    {
        var myUseCase = new DoStuffUseCase();
        myUseCase.Execute(UpdateStatus);
      }

    public void UpdateStatus(string text, bool isThreadRunning)
    {
        Status = text;
    }
}

internal class DoStuffUseCase
{
    public DoStuffUseCase()
    {
    }

// add async-await  here

    public async void Execute(Action<string, bool> callback)
    {
        callback("Begin", true);
        // do stuff which sometimes takes a few seconds
        await Task.Delay(3000);

        callback("End", false);
    }
}

相关问题