【发布时间】:2023-03-12 02:14:01
【问题描述】:
我有一个自动绑定(约定)的问题,它应该在 caliburn.micro 中默认工作。我将 WPF 与 MVVM 一起使用(还有 Fody.PropertyChanged、SimpleInjector、Visual Studio 2015)。我主要使用 ViewModel-first 方法(例如 MainView)。对于这种情况,一切正常 - 文本框自动绑定到 VM 中的属性,标签和按钮相同。
但是当我使用视图优先的方法添加新的用户控件(名为“TestView”)时出现了问题。我在构造函数中添加了带有 InitializeComponent 的代码隐藏,因为之前未呈现用户控件。
我已应用此链接中的所有内容(“查看优先”):https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions
(我只留下了未修改的 MefBootstrapper.OnStartup - 在我的例子中是 AppBootstrapper.OnStartup)
我已经:
1. 将[Export("TestViewModel", typeof(TestViewModel))] 添加到我的虚拟机
2. 添加到我的视图xmlns:cal="http://www.caliburnproject.org"
cal:Bind.Model="TestViewModel"
View 的DataContext 设置正确。如果我手动添加绑定,那么一切正常 - 但这应该由 caliburn.micro 自动完成(例如 ViewModel-first)。
我错了吗?还是我必须手动设置 View-first 的绑定?还是我忘记了什么?或者也许一些变化是 .net 和 caliburn.micro 已经过时了......
以下完整代码(MainView 使用 ViewModel-first,TestView 使用 View-first):
https://github.com/Krzyrok/caliburn.micro-problem
PS(旁注/问题/澄清)
我知道更流行的是 ViewModel-first 方法,我可以将我的 UserControl 更改为此(并且自动绑定将再次起作用)。问题与此无关,但以下是我的动机(也许 WPF 中建议了另一种方法):
我选择这个解决方案是因为我想要“封闭”组件(类似于使用 React 在前端拆分组件)——我想使用一个“完整”组件/UserControl,我可以在 MainView 上使用它,而无需在 MainVM 中声明任何额外的 VM。在我的情况下,TestView 确切地知道应该使用什么 VM,因此没有理由强迫我/另一个程序员也声明 VM - 它只需要他将来会使用的 View(VM 是逻辑的“技术细节/实现”) .但是:是否有另一种方法可以将视图拆分为 WPF 中较小的“组件”/部分(建议使用)?我进行了搜索,UserControl 似乎符合假设。
编辑:“组件/部分”是指视图的某些部分([组成] 几个负责例如显示/编辑用户详细信息的控件)。
这只是旁注/问题,所以请关注主要问题:)
【问题讨论】:
-
在澄清方面:我实现这一点的方式(本质上将视图拆分为组件)是使用控件(而不是用户控件)。控件可以在不需要视图模型的情况下实现您想要的。在这种情况下,您在一个类中创建变量和逻辑,然后通过样式实现外观。通过这种方式,您可以将 ViewModel 链接到顶层控件。请查看以下教程以实现此操作:wpftutorial.net/HowToCreateACustomControl.html 注意;不作为答案发布,因为不回答给定的问题。
-
@DHansen 据我了解,自定义控件用于覆盖控件/创建新控件。但仅适用于一个“小控件”(例如,在带有控件的库中)。并且用户控件可以封装一些控件组合(例如表单)——而不是 UI 的一部分,而不是特定的一个小控件。 wpftutorial.net/CustomVsUserControl.html 在我的情况下我会第二个(提取独立的视图部分 - 可以在另一个视图上使用)。但这向我表明 WPF 有很多选择,谢谢 :)
标签: wpf data-binding caliburn.micro