C# ContentControl未更新

C# ContentControl未更新,c#,wpf,xaml,data-binding,reactiveui,C#,Wpf,Xaml,Data Binding,Reactiveui,我正在尝试创建一个绑定到a视图的主窗口。我在代码中更改了该视图,并希望它在主窗口中更新,但这并没有发生 我的XAML中有这个代码 然后,我通过此代码更改控制 public类MainWindowViewModel:ReactiveObject { 私有用户控制_CurrentControl=null; 公共用户控件CurrentControl { 得到 { 如果(_CurrentControl==null) { _CurrentControl=新主页(); } 返回电流控制; } 设置 { t

我正在尝试创建一个绑定到a视图的主窗口。我在代码中更改了该视图,并希望它在主窗口中更新,但这并没有发生

我的XAML中有这个代码


然后,我通过此代码更改控制

public类MainWindowViewModel:ReactiveObject
{
私有用户控制_CurrentControl=null;
公共用户控件CurrentControl
{
得到
{
如果(_CurrentControl==null)
{
_CurrentControl=新主页();
}
返回电流控制;
}
设置
{
this.RaiseAndSetIfChanged(x=>x.CurrentControl,值);
}
}
}
如您所见,我正在使用ReactiveUI库


在该视图中使用
ContentControl
是错误的,还是我没有正确绑定和更新

为什么将类命名为MainWindowViewModel?当你想做mvvm时,你不应该在你的VM中有UserControl类型的属性

通常的mvvm方式如下所示:

  • InotifyProperty已更改的视图模型
公共类MyViewmodel
{
公共IWorkspace MyContent{get;set;}
}
  • 绑定到虚拟机的xaml内容控件

  • datatemplate-->以便wpf知道如何呈现IWorkspace

我认为您这里有几个混乱的概念,它们相互妨碍

首先,您实际上没有使用任何reactiveUI代码,它永远不会被调用。由于get访问器实现了延迟实例化模式,因此这意味着set访问器被忽略。这意味着视图从不通知属性更改,因此您永远不会得到更新

我建议使用更像

private UserControl _currentControl;

public MainWindowVirwModel()
{
  CurrentControl = new HomePage();
}

public UserControl CurrentControl
{
  get { return _curentControl;}
  set { this.RaiseAndSetIfChanged(...); }
}

此外,这仍然会在ViewModel层中混淆视图组件,即主页,这将使单元测试更加困难

实际上有一种更好的方法,使用
ViewModelViewHost

<Grid DataContext="{Binding ViewModel, ElementName=TheUserControl}">
    <ViewModelViewHost ViewModel="{Binding CurrentControlViewModel}" />
</Grid>
在应用程序启动的某个地方,您应该写:

RxApp.Register(typeof(IViewFor<HomePageViewModel>), typeof(HomePage));
RxApp.Register(typeof(IViewFor),typeof(HomePage));
什么是ViewModelViewHost?
ViewModelViewHost
将获取您通过绑定提供的ViewModel对象,并使用服务位置查找适合它的视图。Register调用是如何将视图与ViewModels关联的。

您当然可以将数据绑定到
Content
属性。查找绑定错误。当前绑定显示第一个视图时是正确的,只是没有更新到新视图。RaiseAndSetIfChanged是否实现INotifyPropertyCHanged?如果没有,那么我会添加它,以便让UI知道changes@JKing我相信是的,它来自ReactiveUI库我不知道那个库,你有权访问它的源代码来确认吗。另外,您可以在CurrentControl setter中自己实现它,看看它是否解决了您的问题。我在UI不更新时遇到了其他问题,结果通常是InotifyPropertyChange的问题。我不得不承认我不知道ReactiveUI。我只是写了我的答案,因为Rumel将他的类命名为..viewmodel,我将其与下面的MVVMCheck相关联,以查看ReactiveUI方式™ 为此,如何访问ViewModelHost?它位于ReactiveUI.Routing(ReactiveUI Xaml NuGet包的一部分)中。您需要在页面顶部添加一个“xmlns”声明
RxApp.Register(typeof(IViewFor<HomePageViewModel>), typeof(HomePage));