【发布时间】:2012-11-21 21:07:04
【问题描述】:
我有一个ControlTemplate,我想在其中接收两个集合并将它们组合成一个集合,然后将其绑定到一个ItemsControl。计算由我创建的Calculator 对象完成模板的ResourceDictionary 中的一个实例。
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:IndicatorBar}">
<ControlTemplate.Resources>
<local:Calculator
x:Key="_calculator"
Ranges="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Ranges}"
DataSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataSource}" />
</ControlTemplate.Resources>
<ItemsControl ItemsSource="{Binding Ratios, Source={StaticResource _calculator}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{Binding Range}">
<TextBlock Text="{Binding Ratio}" Foreground="White" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ControlTemplate>
</Setter.Value>
</Setter>
但是,这似乎不起作用并导致绑定错误:
System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。
绑定表达式:路径=范围;数据项=空;目标元素是 '计算器' (HashCode=33746798);目标属性是“范围”(类型 '范围')
System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。
绑定表达式:路径=数据源;数据项=空;目标元素是 '计算器' (HashCode=33746798);目标属性是“数据源” (类型“IEnumerable”)
我不确定如何解决这个问题,所以任何帮助都将不胜感激!
【问题讨论】:
-
您的错误表明 targetElement 是“计算器”,但您的 ControlTemplate 是针对“local:IndicatorBar”键入的。这两个对象在您的树中如何关联?
-
描述上下文的代码太少。请发布您如何使用此模板(例如 XAML 中使用的 IndicatorBar 类型)以及您设置其 Ranges 和 DataSource 属性的代码。
-
如果你有计算器的源代码,那么我可能会将它作为一个多值转换器,将两个集合作为参数。然后你可以做你的 ItemsSource 绑定传递转换器。
-
Calculator 类中的 Ranges 和 Datasource 属性是依赖属性吗?
-
@BillTarbell 如果您在 XAML 中看到,我有一个计算器正在处理控件的输入,然后将边框绑定到计算器的输出。