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