在我开始使用Caliburn.Micro
的项目上。
现在我想将一个较大的UserControl
拆分为几个较小的UserControls
,以便我可以在DataTemplates
内使用它们。 EisenbergEffect建议这样做in this answer
这些ViewModels
已存在,因为我将分层数据建模为ObservableCollection<SubViewModel>
。
现在我想我必须为那些Views
创建适合UserControls
SubViewModels
。
我的观点是Master-Details视图。我想提供一个计算机列表,在详细信息视图中,我想拥有那些硬件组件。
<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
- 方式,它在那里工作得非常好(使用IOC注入外部ViewModel获取Content
)。
但它似乎不适合DataTemplate部分(尽管不是很令人惊讶)。 SubViewModel派生自Screen
,作为外部ViewModels。
如何将新的UserControl用作DataTemplate?
答案 0 :(得分:1)
仔细看看EisenbergEffect的答案。明确声明,约定不在DataTemplate
内工作,所以如果你有一个复杂的模板,最好把它移到一个单独的UserControl
,其中有些约定会再次运作。
这意味着您必须在模板中显式绑定模型:
<ListView x:Name="ComputerViewModels">
<ListView.ItemTemplate>
<DataTemplate>
<ContentControl cal:View.Model="{Binding HardwareComponentViewModel}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
应该这样做。无论是那个还是cal:Model.Bind="{...}"
,我都记不起差异和用例。现在在绑定的UserControl
(HardwareComponentView
中,我认为)视图和视图模型之间的约定应该照常工作。