ContentControl不更新

Rum*_*mel 5 c# data-binding wpf xaml reactiveui

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

我在XAML中有这个代码

<Grid>
    <ContentControl Content="{Binding Source={StaticResource ViewModelLocator}, Path=MainWindowViewModel.CurrentControl}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ana*_*tts 8

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

<Grid DataContext="{Binding ViewModel, ElementName=TheUserControl}">
    <ViewModelViewHost ViewModel="{Binding CurrentControlViewModel}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

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

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

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

RxApp.Register(typeof(IViewFor<HomePageViewModel>), typeof(HomePage));
Run Code Online (Sandbox Code Playgroud)

什么是ViewModelViewHost?

ViewModelViewHost将使用您通过Bindings提供的ViewModel对象,并使用Service Location 查找适合它的View.Register调用是如何将View与ViewModels相关联的.


bli*_*eis 5

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

通常的mvvm方式如下所示:

  • 带有INotifyPropertyChanged的viewmodel
public class MyViewmodel
{
    public IWorkspace MyContent {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
  • 绑定到VM的xaml内容控件
<ContentControl Content="{Binding MyContent}"/>
Run Code Online (Sandbox Code Playgroud)
  • datatemplate - >以便wpf知道如何呈现您的IWorkspace
<DataTemplate DataType="{x:Type local:MyIWorkSpaceImplementationType}" >
   <view:MyWorkspaceView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)