使用WPF在Catel中设置DataContext

时间:2013-08-31 19:06:03

标签: wpf mvvm catel

所以我开始关注Catel MVVM框架,看起来它会解决我遇到的一些问题,但我有一个非常愚蠢的问题。我想我只是错过了一些小事。

我选择了一个较小的WPF项目来切换Catel作为我学习它的一种方式。我有一个简单的“玩家注册”表单,其中包含姓名和姓氏等字段。我使用vm codesnippet重新创建了我的原始视图模型,并且一切都很好,我在文档中读到的所有属性和属性都已设置。

然后我将用于“播放器注册”(PlayerRegistrationView)的UserControl更改为catel:UserControl。我在一个标准的WPF窗口上放置了PlayerRegistrationView(没有别的,只有一个用于View的xmlns和视图作为窗口上的唯一内容,没有属性)

但这是我的问题:

我有一个MainWindow,其上有一个按钮,可以打开播放器注册窗口。点击事件就是:

private void ButtonPlayerClick(object sender, RoutedEventArgs e)
    {
       var playerRegistration = new PlayerRegistrationDialog
            {
                Owner = this,
                DataContext = new PlayerRegistrationViewModel(),
            };

       playerRegistration.Show();
    }

运行我的程序然后单击该按钮会导致我的PlayerRegistrationView上出现NotSupportedException:无法解析视图的视图模型。使用GetViewModelType()方法或IViewModelLocator

我尝试将ViewModel作为窗口上的静态资源并在那里设置datacontext,但它会产生相同的错误。

我不知所措。我错过了什么?

由于

1 个答案:

答案 0 :(得分:2)

Catel的全部意义在于它会自动连接所有视图并查看模型。您要实现的“复杂”事情是您有一个放置在窗口上的视图。您希望窗口具有与视图相同的数据上下文,以便在窗口中执行某些操作。

在Catel中,可以在DataWindow(Catel中的窗口)上放置任何带有datacontext管理的视图。然后它会像这样工作:

数据窗口 | =>图

如果DataWindow和View共享相同的视图模型类型,则它们共享相同的视图模型。例如:

  • PlayerRegistrationWindow =>派生自catel:DataWindow
  • PlayerRegistrationView =>派生自catel:UserControl

由于两者都以PlayerRegistration开头,因此它们将自动解析为PlayerRegistrationViewModel。

要显示窗口,您唯一需要做的就是:

var viewModel = new PlayerRegistrationViewModel();

var uiVisualizerService = ServiceLocator.Default.ResolveType<IUIVisualizerService>();
uiVisualizerService.Show(viewModel);

所有这些都会自动运行,您不必担心自己设置任何datacontext。