使用 ReactiveUI 和 GUI.cs 异步数据加载

发布于 2025-01-10 14:37:48 字数 1169 浏览 0 评论 0原文

我是反应式世界的新手,所以我在这里有点挣扎 x)
这是我的问题:
我如何获取异步数据,然后将它们绑定到标签?

在我的 MainView.cs 中,我有一个标签:

Label usernameLabel = new()
{
    Text = "Loading",

    X = 0,
    Y = 1
};

在我的 MainViewModel.cs 中:

public ReactiveCommand<Unit, UserProfile> LoadUsers { get; }

public MainViewModel(AppClient client)
{
    LoadUsers = ReactiveCommand.CreateFromTask(async _ => await client.GetUserProfile());
    LoadUsers.ObserveOn(RxApp.MainThreadScheduler).Subscribe(x => UserProfile = x);

    LoadUsers.Execute().Subscribe();
}

并且 UserProfile.cs 包含基本内容

internal sealed class UserProfile
{
    public string DisplayName { get; set; }
    // ...
}

首先,我发现这是在互联网上的,有一个教程(我不记得在哪里),所以我不知道这是否是正确的做法。我了解如何使用与 UI 事件等相关的用户命令,但在本例中不了解。
所以,是的,基本上:我如何将此命令的结果绑定到我的标签?

参考文献:

I'm new to the reactive world so i'm struggling a little bit here x)
Here is my question:
How can i fetch async data, then bind them to a label ?

In my MainView.cs, i have a label:

Label usernameLabel = new()
{
    Text = "Loading",

    X = 0,
    Y = 1
};

And in my MainViewModel.cs:

public ReactiveCommand<Unit, UserProfile> LoadUsers { get; }

public MainViewModel(AppClient client)
{
    LoadUsers = ReactiveCommand.CreateFromTask(async _ => await client.GetUserProfile());
    LoadUsers.ObserveOn(RxApp.MainThreadScheduler).Subscribe(x => UserProfile = x);

    LoadUsers.Execute().Subscribe();
}

And UserProfile.cs contains basic things

internal sealed class UserProfile
{
    public string DisplayName { get; set; }
    // ...
}

First, i found this on internet, with a tutorial (i don't remember where tho), so i don't know if it was the right thing to do. I understand how to user commands associated with UI events etc, but not in this case.
So yeah, basically: How can i bind the result of this command to my label ?

Refs:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧时浪漫 2025-01-17 14:37:48

鉴于,UserProfileMainViewModel实现了INotifyPropertyChanged

您可以这样做:

ViewModel
    .WhenAnyValue (x => x.UserProfile.DisplayName)
    .BindTo (usernameLabel, x => x.Text);

实现INotifyPropertyChanged的一个简单方法是让您的视图模型类继承 ReactiveObject 并使用 ReactiveUI.Fody

internal sealed class UserProfile 
{
    [Reactive]
    public string DisplayName { get; set; }
    // ...
}

Gui.cs 反应式示例

关于 ReactiveUI.Fody 的 ReactiveUI 页面

Given, that UserProfile and MainViewModel implements INotifyPropertyChanged:

You can do:

ViewModel
    .WhenAnyValue (x => x.UserProfile.DisplayName)
    .BindTo (usernameLabel, x => x.Text);

An easy way to implement INotifyPropertyChanged is to let your viewmodel classes inherit ReactiveObject and use ReactiveUI.Fody

internal sealed class UserProfile 
{
    [Reactive]
    public string DisplayName { get; set; }
    // ...
}

Gui.cs reactive example

ReactiveUI page about ReactiveUI.Fody

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文