C# TopProperty和BindTo-无需订阅即可获取初始值

C# TopProperty和BindTo-无需订阅即可获取初始值,c#,wpf,binding,reactiveui,C#,Wpf,Binding,Reactiveui,我在.NET4.5中将RXUI6与WPF一起使用 当绑定到的ViewModel属性由ObservablesPropertyHelper支持时,我很难获得提供给视图的初始值 根据报告: ToProperty/OAPH更改 ObservablesPropertyHelper本身不再是一个IObservable,可以随时使用 ObservablesPropertyHelper现在仅在第一次读取值时才延迟订阅源。这明显 提高性能和内存使用率,但代价是一些“为什么 我的测试不起作用吗??“混乱。如果您发

我在.NET4.5中将RXUI6与WPF一起使用

当绑定到的ViewModel属性由
ObservablesPropertyHelper
支持时,我很难获得提供给视图的初始值

根据报告:

ToProperty/OAPH更改

  • ObservablesPropertyHelper本身不再是一个IObservable,可以随时使用

  • ObservablesPropertyHelper现在仅在第一次读取值时才延迟订阅源。这明显
    提高性能和内存使用率,但代价是一些“为什么
    我的测试不起作用吗??“混乱。如果您发现您的TopProperty
    “不起作用”,这可能就是原因

我看了一下,它似乎解决了我同样的问题,但提供的答案在测试中有效,并且使用了
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;
        }
    }
}
// Can't subscribe to (null).Message!
this.WhenAnyValue(t => t.ViewModel.Message)
它现在将触发TextBlock,因为现在有一个订阅。所以我猜
.BindTo()
方法实际上从未算作订阅?还是懒惰之上的懒惰?此空订阅是否否定了其懒惰带来的性能好处?或者我不应该使用
.BindTo()
而只是使用
.Subscribe()
来分配文本块

****编辑**** 好的,在我的代码中可能还有其他的事情发生,因为我无法始终如一地重现这种行为。如果我找到根本原因,我会向你汇报

*编辑2* 我已经证实,我有另一个问题,是导致失火,而不是OAPH。.ToProperty和.BindTo现在似乎像预期的那样一直工作。谢谢

它现在将触发TextBlock,因为现在有一个订阅。所以我猜.BindTo()方法实际上从未算作订阅

BindTo立即订阅源代码,并应启动OAPH。但是,在视图获得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;
        }
    }
}
// Can't subscribe to (null).Message!
this.WhenAnyValue(t => t.ViewModel.Message)

感谢Paul提供的附加信息和一个很棒的框架。我真希望我能弄明白为什么我原来的问题会因为额外的空订阅而得到解决,但我最终没有足够的时间来解决这个问题,只是出于好奇。我的根本问题在于我的IObservable,而不是OAPH。再次感谢。