Я нахожусь в процессе создания пользовательского элемента управления, в частности круговой диаграммы. Я хочу, чтобы разметка выглядела примерно так:
<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 во время выполнения. В данном случае я ничего не вижу.