【问题标题】:Using Usercontrol inside Datatemplate在 Datatemplate 中使用 Usercontrol
【发布时间】:2013-05-16 16:46:24
【问题描述】:

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

现在我想将一个大的UserControl 拆分成几个小的UserControls,这样我就可以在DataTemplates 中使用它们。 EisenbergEffect 建议这样做in this answer

ViewModels 已经存在,因为我将分层数据建模为ObservableCollection<SubViewModel>

现在我想我只需要为SubViewModelsUserControls 创建西装Views

我的视图是主从视图。我想显示计算机列表,并在详细信息视图中显示这些计算机的 HardwareComponents。

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

我已按照此处的建议包含调试输出:Debug Logging

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

在创建 ComputerViewModel 时已经创建了 HardwareComponentViewModel。

我已经在应用程序的其他部分使用了ContentControl - 方式,它在那里运行良好(使用注入外部 ViewModel 的 IOC 获取 Content)。 但它似乎不适合 DataTemplate 部分(不过这并不令人惊讶)。 SubViewModel 派生自 Screen,作为外部 ViewModel。

如何将新的 UserControl 用作 DataTemplate?

【问题讨论】:

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


    【解决方案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,我认为)内,视图和视图模型之间的约定应该照常工作。

    【讨论】:

    • 我有点震惊。以为我已经尝试了至少三遍。刚刚插入&lt;ContentControl cal:View.Model="{Binding}" /&gt;,现在它可以工作了!太感谢了! (顺便说一句,不工作的约定是我想拆分视图的主要原因)
    • @MareInfinitus 没问题,很高兴我能帮上忙。微不足道的错误通常是最难发现的:)
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多