0

在我开始使用的项目中Caliburn.Micro

现在我想把一个大的拆分UserControl成几个小UserControls的,这样我就可以在里面使用它们了DataTemplates。EisenbergEffect 建议在这个答案中这样做

因为ViewModels我将分层数据建模为ObservableCollection<SubViewModel>.

现在我想我只需要ViewsUserControls那些SubViewModels.

我的视图是主从视图。我想提供一个计算机列表,在详细信息视图中我想拥有这些计算机的 HardwareComponents。

<ListView x:Name="ComputerViewModels">
    <ListView.ItemTemplate>
            <DataTemplate>
                <ContentControl x:Name="HardwareComponentViewModel" />
            </DataTemplate>
     </ListView.ItemTemplate>
</ListView>

我已经按照此处的建议包含了调试输出:调试日志记录

而且我没有得到任何关于我的 HardwareComponentViewModel 的输出,除了 Action Convention Not Applied: No actionable element for set_HardwareComponentViewModel

HardwareComponentViewModels 在创建 ComputerViewModels 时已经创建。

我已经ContentControl在应用程序的其他部分使用了 - 方式,并且它在那里工作得很好(将Contentusing IOC 注入到外部 ViewModel 中)。但它似乎不适合 DataTemplate 部分(不过这并不令人惊讶)。SubViewModels 派生自Screen, 作为外部 ViewModels。

如何将新的 UserControl 用作 DataTemplate?

4

1 回答 1

1

仔细看看 EisenbergEffect 的回答。它明确指出,约定在内部不起作用DataTemplate因此如果您有一个复杂的模板,最好将其移出到一个单独的UserControl,其中约定将再次起作用。

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

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

那应该这样做。要么,要么cal:Model.Bind="{...}",我永远记不起区别和用例。现在在边界内UserControlHardwareComponentView我假设)视图和视图模型之间的约定应该像往常一样工作。

于 2013-05-21T19:44:52.937 回答