在Datatemplate中使用Usercontrol

时间:2013-05-21 19:37:42

标签: c# wpf user-controls datatemplate caliburn.micro

在我开始使用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?

1 个答案:

答案 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="{...}",我都记不起差异和用例。现在在绑定的UserControlHardwareComponentView中,我认为)视图和视图模型之间的约定应该照常工作。