所以我开始研究 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/