使用 WPF 在 Catel 中设置 DataContext

Posted

技术标签:

【中文标题】使用 WPF 在 Catel 中设置 DataContext【英文标题】:Setting DataContext in Catel with WPF 【发布时间】:2013-08-31 19:06:02 【问题描述】:

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

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

然后,我将用于“玩家注册”(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 设置为窗口上的静态资源并在那里设置数据上下文,但它会产生相同的错误。

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

谢谢

【问题讨论】:

【参考方案1】:

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);

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

【讨论】:

感谢您的回复。好的,所以我只是想保持简单。我制作了 PlayerRegistrationDialog,它是一个 catel:DataWindow。我还创建了一个 PlayerRegistrationDialogViewModel(使用 vm 代码 n-p)。我在标准窗口的主窗口上的按钮的单击事件中使用了上面的代码。现在我得到一个 WindowNotRegisteredException - 没有注册为“PlayerRegistrationDialogViewModel”的窗口 您没有遵循命名约定。请参阅catelproject.atlassian.net/wiki/display/CTL/ViewModelLocator 了解更多信息。如果您不遵循命名约定,则必须手动注册您的视图/视图模型。 嗨 Geert,好的,所以我终于有时间再次查看我的问题以及您的建议。我是否正确地说视图模型需要与视图在同一个项目中?我使用带有 Catel 模板的 WPF 应用程序创建了一个新项目。我在解决方案中添加了一个类库,并将 ViewModel 文件夹移动到该项目并运行该程序然后给我:“在与指定绑定约束匹配的“CatelWPFTest.Views.MainWindow”类型上调用构造函数引发了异常。行号“5”和行位置“2”。 它可以在 diff 程序集中,但是您需要自定义命名约定以便它可以真正找到它。您可以通过覆盖 GetViewModelType 并返回类型来强制它,而不是为了确保它正常工作而自定义定位器。

以上是关于使用 WPF 在 Catel 中设置 DataContext的主要内容,如果未能解决你的问题,请参考以下文章

使用 Catel 创建多个 WPF 应用程序

在 RichTextBox WPF 中设置文化/语言

WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性

WPF 在代码隐藏中设置 TextBox 属性

使用 MvvmCross 时如何在 WPF App.xaml 中设置资源? (MaterialDesignInXamlToolkit)

从 Catel WPF UserControl 中的 ResourceDictionary 中绑定