我对 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。
提前致谢!
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 );