我在.NET 4.5中使用带有WPF的RXUI 6。
当我绑定的ViewModel属性由ObservableAsPropertyHelper
支持时,我一直无法获取提供给我的View的初始值。
ToProperty / OAPH更改
ObservableAsPropertyHelper本身不再是IObservable,使用WhenAny来观察它。
ObservableAsPropertyHelper现在懒惰只有在第一次读取Value时才订阅源。这显着了 提高性能和内存使用率,但代价是“为什么” 不是我的测试工作??“混乱。如果你发现你的ToProperty
“不起作用”,这可能是原因。
我看了this question这似乎解决了我的同样问题,但提供的答案适用于测试和ReactiveCommand
。在我的情况下,我无法找到最简洁的方法,IObservable<>
不一定是ReactiveCommand
(下面简单介绍)。
示例ViewModel:
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;
}
}
}
示例查看代码隐藏:
public partial class View : UserControl, IViewFor<ViewModel>
{
public View()
{
InitializeComponent();
this.WhenAnyValue(t => t.ViewModel.Message)
.BindTo(this, t => t.MessageTextBlock.Text);
}
// ... IViewFor Stuff....
}
现在,Message TextBox将不包含初始值。但是,如果在我的ViewModel中,我将该行添加到构造函数中:
this.WhenAnyValue(t => t.Message).Subscribe(s => {});
它现在将启动到TextBlock,因为现在有一个订阅。所以我猜测.BindTo()
方法实际上并不算作订阅?或者是懒惰之上的懒惰?这个空的订阅是否否定了懒惰的性能优势?或者我应该使用.BindTo()
并使用.Subscribe()
分配TextBlock吗?
****编辑**** 好吧,我的代码中可能还有其他内容,因为我无法一致地重现此行为。如果找到根本原因,我会报告。
*编辑2 * 我已经确认我有另一个导致失火的问题,而不是OAPH。 .ToProperty和.BindTo似乎现在按预期一致地工作。感谢。
答案 0 :(得分:1)
它现在将启动到TextBlock,因为现在有一个订阅。所以我猜测.BindTo()方法实际上并不算作订阅?
BindTo立即订阅源并开始OAPH。但是,在View获取ViewModel之前,此订阅实际上发生:
// Can't subscribe to (null).Message!
this.WhenAnyValue(t => t.ViewModel.Message)