ContentControl不更新

时间:2013-03-12 04:46:26

标签: c# wpf xaml data-binding reactiveui

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

我在XAML中有这段代码

<Grid>
    <ContentControl Content="{Binding Source={StaticResource ViewModelLocator}, Path=MainWindowViewModel.CurrentControl}" />
</Grid>

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

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在该视图中使用是错误的还是我没有正确绑定和更新?

3 个答案:

答案 0 :(得分:8)

使用ViewModelViewHost

实际上有更好的方法
<Grid DataContext="{Binding ViewModel, ElementName=TheUserControl}">
    <ViewModelViewHost ViewModel="{Binding CurrentControlViewModel}" />
</Grid>

现在,您的课程将类似于:

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<HomePageViewModel>), typeof(HomePage));

什么是ViewModelViewHost?

ViewModelViewHost将使用您通过Bindings提供的ViewModel对象,使用服务位置查找适合它的视图。 Register调用是如何将视图与ViewModels相关联的。

答案 1 :(得分:5)

为什么要调用你的类MainWindowViewModel?当你想做mvvm时,你的VM中不应该有UserControl类型的属性。

通常的mvvm方式如下:

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

答案 2 :(得分:3)

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

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

我建议使用更像

的内容
private UserControl _currentControl;

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

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

此外,这仍然混合了ViewModel层中的View组件,即HomePage,这将使单元测试变得更加困难。