使用WPF在Catel中设置DataContext

使用WPF在Catel中设置DataContext,wpf,mvvm,catel,Wpf,Mvvm,Catel,因此,我开始研究Catel MVVM框架,它似乎可以解决我遇到的几个问题,但我有一个非常愚蠢的问题。我想我只是错过了一些小东西 我用我的一个较小的WPF项目来切换Catel,作为我学习它的一种方式。我有一个简单的“玩家注册”表格,上面有名字和姓氏等字段。我使用vm代码片段重新创建了我的原始视图模型,一切都很好,所有的属性和属性都是我在文档中读到的 然后,我将用于“玩家注册”(PlayerRegistrationView)的UserControl更改为catel:UserControl。我将Pla

因此,我开始研究Catel MVVM框架,它似乎可以解决我遇到的几个问题,但我有一个非常愚蠢的问题。我想我只是错过了一些小东西

我用我的一个较小的WPF项目来切换Catel,作为我学习它的一种方式。我有一个简单的“玩家注册”表格,上面有名字和姓氏等字段。我使用vm代码片段重新创建了我的原始视图模型,一切都很好,所有的属性和属性都是我在文档中读到的

然后,我将用于“玩家注册”(PlayerRegistrationView)的UserControl更改为catel:UserControl。我将PlayerRegistrationView放在一个标准的WPF窗口上(没有其他内容,只是视图的一个xmlns,视图是窗口上唯一的内容,没有属性)

但我的问题是:

我有一个带按钮的主窗口,用于打开球员注册窗口。点击事件就是这样的:

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

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

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

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


谢谢

Catel的全部功能是自动连接所有视图和视图模型。您试图实现的“复杂”的事情是,您有一个放置在窗口上的视图。您希望窗口与视图具有相同的数据上下文,以便在窗口中也执行一些操作

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

数据窗口 |=>视图

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

  • PlayerRegistrationWindow=>源自catel:DataWindow
  • PlayerRegistrationView=>源自catel:UserControl
由于两者都以PlayerRegistration开始,因此它们都将自动解析为PlayerRegistrationViewModel

要显示窗口,您只需执行以下操作:

var viewModel=新的PlayerRegistrationViewModel()

var-uiVisualizerService=ServiceLocator.Default.ResolveType();
uiVisualizerService.Show(viewModel);

所有这些都将自动工作,您不必担心自己设置任何datacontext。

谢谢您的回复。好的,所以我只是想保持简单。我制作了PlayerRegistrationDialog,这是一个类别:数据窗口。我还创建了一个PlayerRegistrationDialogViewModel(使用vm代码段)。我在主窗口(标准窗口)上的按钮点击事件中使用了上述代码。现在我得到一个WindowNotRegisteredException-没有注册为“PlayerRegistrationDialogViewModel”的窗口您没有遵守命名约定。有关更多信息,请参阅。如果不遵循命名约定,则必须手动注册视图/视图模型。嗨,Geert,好的,我终于有时间再次查看我的问题和您的建议。我说视图模型需要与视图位于同一项目中,对吗?我使用带有Catel模板的WPF应用程序创建了一个新项目。我向解决方案中添加了一个类库,并将ViewModel文件夹移动到该项目中,运行该程序后,我得到:“对匹配指定绑定约束的类型“CatelWPFTest.Views.MainWindow”调用构造函数时引发了异常。“行号“5”和行位置“2”。它可以位于差异程序集中,但是,您需要自定义命名约定,这样它才能真正找到它。您可以通过重写GetViewModelType并返回类型来强制它,而不是仅仅为了确保它工作而自定义定位器。
var uiVisualizerService = ServiceLocator.Default.ResolveType<IUIVisualizerService>();
uiVisualizerService.Show(viewModel);