在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

仔细看看艾森伯格效应的答案。有人明确指出,约定DataTemplate中不起作用,所以如果你有一个复杂的模板,最好把它移到一个单独的UserControl中,在那里约定会再次起作用。

这意味着您必须在模板中显式绑定模型:

<ListView x:Name="ComputerViewModels">
    <ListView.ItemTemplate>
            <DataTemplate>
                <ContentControl cal:View.Model="{Binding HardwareComponentViewModel}" />
            </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

应该是这样的。无论是那样还是cal:Model.Bind="{...}",我都记不清区别和用例了。现在,在绑定的UserControl(我认为是HardwareComponentView(中,视图和视图模型之间的约定应该照常工作。