wpf - 使用 WPF 在 Catel 中设置 DataContext

标签 wpf mvvm catel

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

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

然后,我将用于“玩家注册”(PlayerRegistrationView) 的 UserControl 更改为 catel:UserControl。我将 PlayerRegistrationView 放置在标准 WPF 窗口上(没有别的,只是 View 的 xmlns,并且 View 作为窗口上的唯一内容,没有属性)

但这是我的问题:

我有一个主窗口,上面有一个按钮可以打开玩家注册的窗口。单击事件如下:

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

       playerRegistration.Show();
    }

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

我尝试将 ViewModel 设置为窗口上的静态资源并在那里设置数据上下文,但它产生了相同的错误。

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

谢谢

最佳答案

Catel 的重点在于它自动连接所有 View 和 View 模型。您想要实现的“复杂”事情是您有一个放置在窗口上的 View 。您希望窗口具有与 View 相同的数据上下文,以便也在窗口中执行一些操作。

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

数据窗口 |=> 查看

如果数据窗口和 View 共享相同 View 模型类型,则它们共享相同的 View 模型。例如:

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

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

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

var viewModel = new PlayerRegistrationViewModel();

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

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

关于wpf - 使用 WPF 在 Catel 中设置 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551787/

相关文章:

c# - 创建具有不同页数和自动分页符的可打印表单

wpf - 组合框,连续多个项目

wpf - WPF 中的 ListBox 与 ViewModel 绑定(bind)

c# - Automapper 将 Flags Enum 从 ViewModel 映射到域模型

数据窗口中的 Catel 取消按钮

c# - WPF 和 Orchestra 入门

c# - 模型中的 INotifyPropertyChanged

c# - MVVM 灯 - 推送通知

c# - Mvvm 取消选中底层 Listbox 对象中的选中框

c# - Catel 框架 - 替换 View