在Datatemplate中使用Usercontrol
本文关键字:Usercontrol Datatemplate | 更新日期: 2023-09-27 18:14:47
在一个项目中,我已经开始使用Caliburn.Micro
。
现在我想把一个大的UserControl
拆分成几个小的UserControls
,这样我就可以在DataTemplates
中使用它们。艾森伯格效应建议在这个答案中这样做
这些数据的ViewModels
已经存在,因为我将层次数据建模为ObservableCollection<SubViewModel>
。
现在我想我只需要为那些SubViewModels
创建适合的Views
作为UserControls
。
我的视图是Master Details视图。我想展示一个计算机列表,在"详细信息"视图中,我想拥有这些计算机的硬件组件。
<ListView x:Name="ComputerViewModels">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl x:Name="HardwareComponentViewModel" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我已经包含了这里建议的调试输出:调试日志
除了Action Convention Not Applied: No actionable element for set_HardwareComponentViewModel
在创建ComputerViewModels时,HardwareComponentViewModels已经创建。
我已经在应用程序的其他部分使用了ContentControl
方式,它在那里运行得很好(使用IOC将Content
注入外部ViewModel(。但它似乎不适合DataTemplate部分(不过这并不奇怪(。子视图模型是从Screen
派生而来的,作为外部视图模型。
如何使用新的UserControl作为DataTemplate
仔细看看艾森伯格效应的答案。有人明确指出,约定在DataTemplate
中不起作用,所以如果你有一个复杂的模板,最好把它移到一个单独的UserControl
中,在那里约定会再次起作用。
这意味着您必须在模板中显式绑定模型:
<ListView x:Name="ComputerViewModels">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding HardwareComponentViewModel}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
应该是这样的。无论是那样还是cal:Model.Bind="{...}"
,我都记不清区别和用例了。现在,在绑定的UserControl
(我认为是HardwareComponentView
(中,视图和视图模型之间的约定应该照常工作。