gpt4 book ai didi

c# - ToProperty 和 BindTo - 无需订阅即可获取初始值

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:19 26 4
gpt4 key购买 nike

我在 .NET 4.5 中使用 RXUI 6 和 WPF。

当它绑定(bind)到的 ViewModel 属性由 ObservableAsPropertyHelper 支持时,我一直无法获得提供给我的 View 的初始值。 .

根据documentation :

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.

我看了this question这似乎解决了我同样的问题,但提供的答案适用于测试和 ReactiveCommand .我想不出最干净的方法来使它在我的情况下与任何 IObservable<> 一起工作不一定是 ReactiveCommand (下面过于简单化)。

示例 View 模型:

public class ViewModel : ReactiveObject
{
private readonly ObservableAsPropertyHelper<string> _message;

public ViewModel()
{
var someObservable = Observable.Return("Hello");

_message = someObservable
.ToProperty(this, t => t.Message);
}

public string Message
{
get
{
return _message.Value;
}
}
}

示例 View 代码隐藏:

public partial class View : UserControl, IViewFor<ViewModel>
{
public View()
{
InitializeComponent();

this.WhenAnyValue(t => t.ViewModel.Message)
.BindTo(this, t => t.MessageTextBlock.Text);
}
// ... IViewFor Stuff....
}

所以现在,消息文本框将不包含初始值。但是,如果在我的 ViewModel 中,我要将行添加到构造函数中:

this.WhenAnyValue(t => t.Message).Subscribe(s => {});

它现在将触发 TextBlock,因为现在有一个订阅。所以我猜 .BindTo()方法实际上从来没有算作订阅?还是懒惰之上的懒惰?这个空订阅是否抵消了它懒惰带来的性能优势?或者我不应该使用 .BindTo()只需使用 .Subscribe()分配 TextBlock?

**** 编辑 ****好的,我的代码中可能发生了其他事情,因为我无法始终如一地重现此行为。如果找到根本原因,我会报告。

* 编辑 2 *我已经确认我有另一个问题导致了失火,而不是 OAPH。 .ToProperty 和 .BindTo 现在似乎一直在按预期工作。谢谢。

最佳答案

It will now fire off to the TextBlock because now there is a subscription. So I'm guessing that the .BindTo() method never actually counts as a subscription?

BindTo 立即订阅源并且应该启动 OAPH。但是,在 View 获得 ViewModel 之前,此订阅实际上发生:

// Can't subscribe to (null).Message!
this.WhenAnyValue(t => t.ViewModel.Message)

关于c# - ToProperty 和 BindTo - 无需订阅即可获取初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252210/

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