我正在制作一个自定义控件——特别是一个饼图。我希望标记看起来像这个例子:
<c:PieChart>
<!-- These dependency properties are never set -->
<c:Slice Value="{Binding RedCount}" />
<c:Slice Value="{Binding BlueCount}" />
<c:Slice Value="{Binding GreenCount}" />
</c:PieChart>
PieChart
源自Control
:
[ContentProperty("Slices")]
public class PieChart : Control
{
public PieChart()
{
Slices = new ObservableCollection<Slice>();
}
public ObservableCollection<Slice> Slices { get; private set; }
}
上面的 XAML 导致该Slices
属性填充三个Slice
.
这是来自的片段Slice
:
public class Slice : ContentControl
{
public static DependencyProperty ValueProperty
= DependencyProperty.Register(
"Value", typeof(double), typeof(Slice),
new PropertyMetadata((p,a) => ((Slice)p).OnValueChanged(a)));
private void OnValueChanged(DependencyPropertyChangedEventArgs e)
{
// This code never called!
}
}
问题是永远不会设置Value
属性。Slice
如果我将依赖属性放在PieChart
并复制绑定表达式,则值已设置,因此我确信我了解依赖属性和绑定的基础知识。
那么,我必须做什么才能让我的依赖属性在子项上设置一个值?由于这些项目在我自己的收藏中,它们是否不在逻辑树中,任何魔法都可以使绑定起作用?
一个简单的“这样做”答案会有所帮助,但我真的很想了解这里出了什么问题,所以我会接受发布的最有见地、解释性的答案。
编辑我没有说清楚,但有一些环境对象DataContext
包含PieChart
属性RedCount
等。过去,当我在绑定路径中出现拼写错误(或其他错误)时,我见过运行时 VS 输出窗口中的警告。在这种情况下,我什么也看不到。