所以我开始关注Catel MVVM框架,看起来它会解决我遇到的一些问题,但我有一个非常愚蠢的问题。我想我只是错过了一些小事。
我选择了一个较小的WPF项目来切换Catel作为我学习它的一种方式。我有一个简单的“玩家注册”表单,其中包含姓名和姓氏等字段。我使用vm codesnippet重新创建了我的原始视图模型,并且一切都很好,我在文档中读到的所有属性和属性都已设置。
然后我将用于“播放器注册”(PlayerRegistrationView)的UserControl更改为catel:UserControl。我在一个标准的WPF窗口上放置了PlayerRegistrationView(没有别的,只有一个用于View的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作为窗口上的静态资源并在那里设置datacontext,但它会产生相同的错误。
我不知所措。我错过了什么?
由于
答案 0 :(得分:2)
Catel的全部意义在于它会自动连接所有视图并查看模型。您要实现的“复杂”事情是您有一个放置在窗口上的视图。您希望窗口具有与视图相同的数据上下文,以便在窗口中执行某些操作。
在Catel中,可以在DataWindow(Catel中的窗口)上放置任何带有datacontext管理的视图。然后它会像这样工作:
数据窗口 | =>图
如果DataWindow和View共享相同的视图模型类型,则它们共享相同的视图模型。例如:
由于两者都以PlayerRegistration开头,因此它们将自动解析为PlayerRegistrationViewModel。
要显示窗口,您唯一需要做的就是:
var viewModel = new PlayerRegistrationViewModel();
var uiVisualizerService = ServiceLocator.Default.ResolveType<IUIVisualizerService>();
uiVisualizerService.Show(viewModel);
所有这些都会自动运行,您不必担心自己设置任何datacontext。