为什么 WhenAnyValue observable 在订阅时触发?

ket*_*ket 2 c# mvvm reactive-programming system.reactive reactiveui

我有以下虚拟视图模型:

public class DummyViewModel : ReactiveObject
{
    internal DummyViewModel()
    {
        ItemChanged.Subscribe(_ => Console.WriteLine());
    }

    public IObservable<string> ItemChanged
    {
        get { return this.WhenAnyValue(x => x.Item).Select(s => s); }
    }

    private string _item;

    public string Item
    {
        get { return _item; }
        set { this.RaiseAndSetIfChanged(ref _item, value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建这个类的一个新实例时,observable 立即在订阅时触发,返回 null(没有任何东西绑定到 Item)。这在我更高级的视图模型中导致了一个问题,我有多个 observable 需要以不同的方式链接在一起。我一直在使用 Skip 和 StartWith 的组合,但它变得非常复杂。有人可以建议为什么会发生这种情况以及我是否应该考虑采用不同的方法?

Cha*_*ger 5

我想这只是“按设计”。 WhenAny和朋友总是返回初始值。这在大多数情况下是有意义的 - 例如,如果您使用ToProperty在最后,并且您通常希望您的财产获得初始值。

显然我不知道您的应用程序的详细信息,但我有两个合理大小的应用程序,并且想不出我需要跳过初始值的时间。

在内部,WhenAny委托ObservableForPropertyObservableForProperty有一个skipInitial论点。所以你可以使用它。或者只是.Skip(1).