【问题标题】:Data-bound UserControl in ListBox.ItemTemplateListBox.ItemTemplate 中的数据绑定用户控件
【发布时间】:2009-11-08 20:43:42
【问题描述】:

我有一个简单的类 Product 和一个名为 ProductSummaryControl 的 UserControl。 ProductSummaryControl 显示传递到其 DataContext 的 Product 类的详细信息。当我手动设置控件及其属性时,我已经验证这可以正常工作。

当我尝试将 ProductSummaryControl 用作 ListBox ItemTemplate 的一部分时遇到了问题。这是相关代码:

<ListBox x:Name="ProductsList" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <local:ProductSummaryControl DataContext="{Binding}" HorizontalAlignment="Stretch"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我将 ListBox ItemsSource 设置为 List,我看到 ProductSummaryControl 的多个实例对应于列表中的产品数量,但控件未正确绑定到数据。我在网上找到的所有自定义 ItemTemplate 的示例都表明 {Binding} 是获取项目值的正确方法,但我显然遗漏了一些东西......

更新:

我做了更多研究,发现 ProductSummaryControl 的 DataContext 被设置为 Product() 的默认实例。我认为这是因为:

 <UserControl.Resources>
    <DBSchmid_Data:Product x:Key="ProductDataSource" d:IsDataSource="True"/>
</UserControl.Resources>
<UserControl.DataContext>
    <Binding Mode="OneWay" Source="{StaticResource ProductDataSource}"/>
</UserControl.DataContext>

这是由于在 Blend 中设置 UserControl 的 DataContext 导致控件中的各种元素可以引用继承的 DataContext 的属性。我验证我可以通过按钮单击方法更改 DataContext 的值并让绑定正常工作,所以我认为它也可以通过模板进行绑定。显然这两种情况的处理方式不同,但我仍然不明白如何。

【问题讨论】:

  • 这对我有用。你能描述一下它是怎么出错的吗?当您在调试器下运行输出窗口时,您是否在输出窗口中看到任何绑定错误?

标签: wpf binding listbox user-controls itemtemplate


【解决方案1】:

我终于有机会与这个进行更多的斗争并让它发挥作用。我不得不删除StaticResource,因为它会干扰设置ProductSummaryControlDataContext。我仍然不明白为什么,但删除资源允许绑定发生。我还必须将 DataContext 指向拥有模板化控件的 ContentPresenter 的 Content 属性。

<DataTemplate>
    <local:ProductSummaryControl DataContext="{TemplateBinding Content}" 
                                 HorizontalAlignment="Stretch"/>
</DataTemplate>

【讨论】:

    【解决方案2】:

    可能是您构建 ProductSummaryControl 的方式存在问题,因为即使您不放置 {Binding},DataContext 也会自动继承到控件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2011-02-23
      • 2010-10-10
      • 2012-06-28
      • 2012-03-29
      相关资源
      最近更新 更多