カスタム コントロール、特に円グラフを作成中です。マークアップを次の例のようにしたい:
<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
プロパティに の 3 つのインスタンスが設定されます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
プロパティ onSlice
が設定されないことです。に依存関係プロパティを置いてPieChart
バインディング式をコピーすると、値が設定されるので、依存関係プロパティとバインディングの基本を理解していると確信しています。
では、依存関係プロパティで子アイテムに値を設定するにはどうすればよいでしょうか? これらのアイテムは私自身のコレクションにあるため、何らかの方法でバインドを機能させる魔法によって認識される論理ツリーに含まれていないのでしょうか?
単純な「これを行う」という回答は役に立ちますが、ここで何がうまくいかないのかを本当に理解したいので、投稿された最も洞察に満ちた説明的な回答を受け入れます.
EDIT私はそれを明確にしませんでしたが、プロパティなどを含むアンビエントオブジェクトがいくつかありDataContext
ますPieChart
。RedCount
過去に、バインディングのパスにタイプミス(またはその他の間違い)があったとき実行時に VS 出力ウィンドウに警告が表示されます。この場合、何も見えません。