ReactiveUI 在子 ViewModel 的属性更改时发出通知

问题描述 投票:0回答:1

我对 ReactiveUI 还很陌生,所以我不确定我是否在这里遗漏了一些明显的东西。

我的 MainWindow 有一个 ViewModel,它是空的,仅绑定到

Content
属性。

public class MainWindowViewModel : ViewModelBase
{
    private ViewModelBase _content;

    public ViewModelBase Content
    {
        get => _content;
        private set => this.RaiseAndSetIfChanged(ref _content, value);
    }

    public MainWindowViewModel()
    {
        HomeViewModel homeViewModel = new HomeViewModel();

        homeViewModel
            .WhenAnyValue(x => x.CurrentItem)
            .Select(_ => new MainViewModel())
            .ToProperty(this, x => x.Content);

        Content = homeViewModel;
    }
}

如您所见,构造函数创建了一个

HomeViewModel
,它是
HomeControl
的 ViewModel。 在这个 ViewModel 中,我创建了一个命令,它应该只设置一个属性。

public class HomeViewModel : ViewModelBase
{
    private ObservableAsPropertyHelper<ItemWrapper> _currentItem;

    public ReactiveCommand<Unit, ItemWrapper> GetItemCommand { get; }

    public ItemWrapper CurrentItem => _currentItem.Value;

    public HomeViewModel()
    {
        GetItemCommand = ReactiveCommand.CreateFromTask(getItem);

        _currentItem = GetItemCommand.ToProperty(this, x => x.CurrentItem);
    }

    private async Task<ItemWrapper> getItem() { ... }
}

通常我习惯在

OnPropertyChanged
的 setter 中调用
CurrentItem
。然而,文档描述的方式
ObservableAsPropertyHelper
这应该被自动调用。因此
WhenAnyValue
应该在
MainWindowViewModel
内部触发,并且应该创建新的 ViewModel。

提前致谢!

c# reactiveui avaloniaui
1个回答
0
投票
homeViewModel
    .WhenAnyValue(x => x.CurrentItem)
    .Select(_ => new MainViewModel())
    .ToProperty(this, x => x.Content);

这段代码什么也不做。您创建一个 ObservableAsPropertyHelper 对象,然后不将其分配给任何对象。要么直接赋值:

_nonexistingMemberOAPH = homeViewModel.WhenAnyValue(....

或者使用 ToProperty 重载来为您完成此操作:

    .ToProperty(this, x => x.Content, out _nonexistingMemberOAPH );
© www.soinside.com 2019 - 2024. All rights reserved.