[英]Using Usercontrol inside Datatemplate
在一个项目中,我已经开始使用Caliburn.Micro
。
现在,我想将一个较大的UserControl
拆分为几个较小的UserControls
,以便可以在DataTemplates
使用它们。 艾森伯格效应建议在此答案中这样做
那些ViewModels
已经存在,因为我将层次数据建模为ObservableCollection<SubViewModel>
。
现在我想我只需要为那些SubViewModels
创建适合的Views
作为UserControls
。
我的视图是主从视图。 我想显示一个计算机列表,并在“详细信息”视图中我想要这些计算机的硬件组件。
<ListView x:Name="ComputerViewModels">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl x:Name="HardwareComponentViewModel" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我已按照此处的建议包含了Debug输出: Debug Logging
而且我没有得到有关我的HardwareComponentViewModel的任何输出,除了Action Convention Not Applied: No actionable element for set_HardwareComponentViewModel
在创建ComputerViewModels时,已经创建了HardwareComponentViewModels。
我已经在应用程序的其他部分上使用了ContentControl
方式,并且在那里效果很好(使用注入到外部ViewModel中的IOC获取Content
)。 但这似乎不适合DataTemplate部分(尽管这并不十分令人惊讶)。 SubViewModels从Screen
派生为外部ViewModels。
如何将新的UserControl用作DataTemplate?
仔细看看EisenbergEffect的答案。 它明确指出,该公约没有在里面工作DataTemplate
,所以如果你有一个复杂的模板,最好将其移出到一个单独的UserControl
,在其内部约定会再次合作。
这意味着您必须在模板内显式绑定模型:
<ListView x:Name="ComputerViewModels">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding HardwareComponentViewModel}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
那应该做。 无论是cal:Model.Bind="{...}"
还是cal:Model.Bind="{...}"
,我都不记得有什么区别和用例。 现在,在绑定的UserControl
(我认为是HardwareComponentView
)内部,视图和视图模型之间的约定应该照常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.