3

我有一个简单的产品类和一个名为 ProductSummaryControl 的用户控件。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 的值并让绑定正常工作,所以我认为它也可以通过模板进行绑定。显然这两种情况的处理方式不同,但我仍然不明白如何处理。

4

2 回答 2

1

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

<DataTemplate>
    <local:ProductSummaryControl DataContext="{TemplateBinding Content}" 
                                 HorizontalAlignment="Stretch"/>
</DataTemplate>
于 2009-11-14T16:17:46.773 回答
0

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

于 2009-11-08T21:02:58.573 回答