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变得更加困难。