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