ToProperty和BindTo - 获取初始值而无需订阅

时间:2014-08-11 20:52:34

标签: c# wpf binding reactiveui

我在.NET 4.5中使用带有WPF的RXUI 6。

当我绑定的ViewModel属性由ObservableAsPropertyHelper支持时,我一直无法获取提供给我的View的初始值。

根据documentation

  

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似乎现在按预期一致地工作。感谢。

1 个答案:

答案 0 :(得分:1)

  

它现在将启动到TextBlock,因为现在有一个订阅。所以我猜测.BindTo()方法实际上并不算作订阅?

BindTo立即订阅源并开始OAPH。但是,在View获取ViewModel之前,此订阅实际上发生

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