gpt4 book ai didi

reactiveui - 绑定(bind)到 ReactiveCommand.IsExecuting

转载 作者:行者123 更新时间:2023-12-04 11:05:45 24 4
gpt4 key购买 nike

我想知道绑定(bind)到 ReactiveCommand 的 IsExecuting 的推荐方式.

问题是初始命令执行(在构造函数末尾开始)没有使用 IsLoading 更新 WPF 控件。作为绑定(bind),尽管后续调用按预期工作。

更新 2 添加测试绑定(bind)代码

这显示了 IsLoading 时的装饰器内容。是真的

<ac:AdornedControl IsAdornerVisible="{Binding IsLoading}">
<ac:AdornedControl.AdornerContent>
<controls1:LoadingAdornerContent/>
</ac:AdornedControl.AdornerContent>
<fluent:ComboBox
ItemsSource="{Binding Content, Mode=OneWay}"
DisplayMemberPath="Name"
SelectedValuePath="ContentId"
SelectedValue="{Binding SelectedContentId}"
IsSynchronizedWithCurrentItem="True"
/>
</ac:AdornedControl>

更新

我找到了这个:
https://github.com/reactiveui/rxui-design-guidelines

并认为我应该能够执行以下操作:
this._isLoading = this.WhenAnyValue(x => x.LoadCommand.IsExecuting)
.ToProperty(this, x => x.IsLoading);

但它给出了编译错误:

The type arguments for method 'ReactiveUI.OAPHCreationHelperMixin.ToProperty< TObj,TRet>(System.IObservable< TRet>, TObj, System.Linq.Expressions.Expression< System.Func< TObj,TRet>>, TRet, System.Reactive.Concurrency.IScheduler)' cannot be inferred from the usage. Try specifying the type arguments explicitly.



我也试过:
this._isLoading = this.WhenAnyValue(x => x.LoadCommand.IsExecuting)
.ToProperty<TheViewModel, bool>(this, x => x.IsLoading);

但得到编译错误:

'System.IObservable< System.IObservable< bool >>' does not contain a definition for 'ToProperty' and the best extension method overload 'ReactiveUI.OAPHCreationHelperMixin.ToProperty< TObj,TRet>(System.IObservable< TRet>, TObj, System.Linq.Expressions.Expression< System.Func< TObj,TRet>>, TRet, System.Reactive.Concurrency.IScheduler)' has some invalid arguments





Instance argument: cannot convert from 'System.IObservable>' to 'System.IObservable'



原文如下

通过访问 IsLoading,我的帖子末尾列出的代码适用于初始绑定(bind)。属性(property),这听起来像是启动了订阅。但从进一步阅读看来我应该使用 WhenAny而且我似乎无法弄清楚放在我 Nose 前面的是什么:

ToProperty and BindTo - Get initial value without Subscribing

添加:
this.WhenAnyValue(x => x.LoadCommand.IsExecuting);

也可以,但是有更好的方法吗?

我在考虑删除 ObservableAsPropertyHelper因为它似乎对我没有多大作用并制作 IsLoading一个正常的属性,如:
private bool _isLoading;

public bool IsLoading
{
get { return _isLoading; }
set { this.RaiseAndSetIfChanged(ref _isLoading, value); }
}

并执行以下操作,但无法编译,因为它试图分配 IObservable< bool>一个 bool 值:
this.WhenAnyValue(x => x.LoadCommand.IsExecuting)
.Subscribe(x => IsLoading = x);

当前代码:
private readonly ObservableAsPropertyHelper<bool> _isLoading;

public bool IsLoading
{
get { return _isLoading.Value; }
}

LoadCommand = ReactiveCommand.CreateAsyncTask(async _ =>
{
//go do command stuff like fetch data from a database
}

LoadCommand.IsExecuting.ToProperty(this, x => x.IsLoading, out _isLoading);

//works if I have this line
var startSubscription = IsLoading;

LoadCommand.ExecuteAsyncTask();

最佳答案

我以前遇到过这种情况,我认为您正在经历的谎言here .

ToProperty / OAPH changes

  • ObservableAsPropertyHelper no longer is itself an IObservable, use WhenAny to observe it.

  • ObservableAsPropertyHelper now lazily Subscribes to the source only when the Value is read for the first time. This significantly improves performance and memory usage, but at the cost of some "Why doesn't my test work??" confusion. If you find that your ToProperty "isn't working", this may be why.


它是惰性的,因此您必须订阅它(即,如果使用 OAPH,则从属性中请求一个值)才能使其工作。这就是为什么您注意到您的 var startSubscription = IsLoading; '修复'问题。
知道这让我更容易确定这是否是一个问题,或者只是在我的单元测试期间要记住的事情,知道在我的应用程序中这些属性将被绑定(bind)并因此被订阅,使其没有实际意义实践。你知道,整个“树倒在森林里,没有人听到”的想法。
我认为你应该坚持使用 ToProperty你有,这似乎是恕我直言的方法。

关于reactiveui - 绑定(bind)到 ReactiveCommand.IsExecuting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25590339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com