ContentControl不更新

我正在尝试将一个绑定到视图的MainWindow。 我在代码中更改了该视图,并期望它在主窗口中更新,但是没有发生。

我在XAML中有这个代码

   

然后我通过此代码更改我的控件

 public class MainWindowViewModel : ReactiveObject { private UserControl _CurrentControl = null; public UserControl CurrentControl { get { if (_CurrentControl == null) { _CurrentControl = new HomePage(); } return _CurrentControl; } set { this.RaiseAndSetIfChanged(x => x.CurrentControl, value); } } } 

如您所见,我正在使用ReactiveUI库。

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

使用ViewModelViewHost实际上有更好的方法:

    

现在,您的课程将如下所示:

 public class MainWindowViewModel : ReactiveObject { private ReactiveObject _CurrentControlViewModel = new HomePageViewModel(); public ReactiveObject CurrentControlViewModel { get { return _CurrentControl; } set { this.RaiseAndSetIfChanged(x => x.CurrentControlViewModel, value); } } } 

在应用启动的某个地方,你应该写:

 RxApp.Register(typeof(IViewFor), typeof(HomePage)); 

什么是ViewModelViewHost?

ViewModelViewHost将使用您通过Bindings提供的ViewModel对象,并使用Service Location 查找适合它的View。 Register调用是您可以将Views与ViewModel相关联的方式。

为什么你打电话给你的class级MainWindowViewModel? 当你想做mvvm时,你的VM中不应该有UserControl类型的属性。

通常的mvvm方式如下所示:

  • 带有INotifyPropertyChanged的viewmodel
 public class MyViewmodel { public IWorkspace MyContent {get;set;} } 
  • 绑定到VM的xaml内容控件
  
  • datatemplate – >以便wpf知道如何呈现您的IWorkspace
    

我认为你在这里有几个混乱的概念,他们正在互相进入。

首先,你实际上并没有使用任何的react native代码,它永远不会被调用。 由于get访问器实现了一个惰性实例化模式,因此它意味着忽略了set访问器。 这意味着视图永远不会通知属性更改,因此您永远不会获得更新。

我建议使用更像的东西

 private UserControl _currentControl; public MainWindowVirwModel() { CurrentControl = new HomePage(); } public UserControl CurrentControl { get { return _curentControl;} set { this.RaiseAndSetIfChanged(...); } } 

此外,这仍然混合View组件,即ViewModel层内的HomePage,这将使unit testing变得更加困难。