繁体   English   中英

在Datatemplate内部使用Usercontrol

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM