数据绑定的UserControl在ListBox.ItemTemplate中

3

我有一个简单的类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设置为一个列表,我看到与列表中产品数量相对应的多个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的值,并且绑定可以正常工作,因此我认为通过模板绑定也可以正常工作。显然,这两种情况被不同地处理,但我仍然不理解如何处理。


这对我有效。你能描述一下它出了什么问题吗?当你在调试器下运行它时,是否在输出窗口中看到任何绑定错误? - itowlson
2个回答

1

我终于有机会更深入地研究这个问题并解决了它。我不得不删除StaticResource,因为它干扰了设置ProductSummaryControlDataContext。我仍然不明白为什么,但是删除资源允许绑定发生。我还必须将DataContext指向拥有模板控件的ContentPresenter的Content属性。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接