2

所以我开始研究 Catel MVVM 框架,它看起来可以解决我遇到的几个问题,但我有一个非常愚蠢的问题。我想我只是缺少一些小东西。

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

然后,我将用于“玩家注册”(PlayerRegistrationView) 的 UserControl 更改为 catel:UserControl。我将 PlayerRegistrationView 放在标准的 WPF 窗口上(没有别的,只是视图的 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 成为窗口上的静态资源并在那里设置数据上下文,但它会产生相同的错误。

我很茫然。我错过了什么?

谢谢

4

1 回答 1

2

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

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

数据窗口 |=> 查看

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

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

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

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

var viewModel = new PlayerRegistrationViewModel();

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

一切都会自动运行,您不必担心自己设置任何数据上下文。

于 2013-08-31T20:51:46.237 回答