我在 .NET 4.5 中使用 RXUI 6 和 WPF。
当绑定到的 ViewModel 属性由一个支持时,我一直无法获取提供给我的视图的初始值ObservableAsPropertyHelper
.
根据文档 https://github.com/reactiveui/ReactiveUI/blob/master/docs/migrating-from-rxui5.md#toproperty--oaph-changes:
ToProperty / OAPH 变更
我在看这个问题 https://stackoverflow.com/questions/22432822/observableaspropertyhelper-have-to-access-value-to-get-it-to-subscribe这似乎解决了我同样的问题,但提供的答案在测试中有效并且具有ReactiveCommand
。我无法找出最干净的方法来让它在我的情况下与任何IObservable<>
不一定是ReactiveCommand
(下面过于简化)。
视图模型示例:
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....
}
所以现在,消息文本框将不包含初始值。但是,如果在我的 ViewModel 中我要将这一行添加到构造函数中:
this.WhenAnyValue(t => t.Message).Subscribe(s => {});
现在它将触发 TextBlock,因为现在有订阅。所以我猜.BindTo()
方法实际上从未算作订阅?或者是懒惰之上的懒惰?这个空订阅是否会抵消其懒惰带来的性能优势?或者我不应该使用.BindTo()
只需使用一个.Subscribe()
分配 TextBlock?
**** 编辑 ****
好吧,我的代码中可能还有其他问题,因为我无法一致地重现这种行为。如果我找到根本原因,我会报告。
* 编辑 2 *我已确认是我的另一个问题导致了失火,而不是 OAPH。 .ToProperty 和 .BindTo 现在似乎按预期一致工作。谢谢。