私は、次のリソースを持っている:WPFのDataContextは、一見同じ状況で異なる動作を
<Window.Resources>
<SolidColorBrush x:Key="b" Color="{Binding B}" />
<my:C x:Key="c" Prop="{Binding Source={StaticResource b}}" />
<my:C x:Key="d" Prop="{Binding A}" />
<Ellipse x:Key="e" Fill="{Binding A}" />
<Ellipse x:Key="f">
<Ellipse.Fill>
<SolidColorBrush Color="{Binding B}" />
</Ellipse.Fill>
</Ellipse>
</Window.Resources>
私の窓は、データコンテキストは次のように宣言している:
<Window ... DataContext="{my:Context}" ...>
Cとコンテキストは次のように定義されているカスタムクラス:
public class Context : MarkupExtension
{
public Brush A { get; } = Brushes.Blue;
public Color B { get; } = Colors.Red;
public override object ProvideValue(IServiceProvider serviceProvider) => this;
}
public class C : DependencyObject
{
public static readonly DependencyProperty PropProperty = DependencyProperty.Register("Prop", typeof(Brush), typeof(C));
public Brush Prop { get { return (Brush)GetValue(PropProperty); } set { SetValue(PropProperty, value); } }
}
ここで、私のデータコンテキストとバインディングを使用する方法は非常に私に似て、まだ私は(ボタンのクリックハンドラ内)
MessageBox.Show("f: " + ((FindResource("f") as Ellipse).Fill?.ToString() ?? "null"));
MessageBox.Show("e: " + ((FindResource("e") as Ellipse).Fill?.ToString() ?? "null"));
MessageBox.Show("d: " + ((FindResource("d") as C).Prop?.ToString() ?? "null"));
MessageBox.Show("c: " + ((FindResource("c") as C).Prop?.ToString() ?? "null"));
MessageBox.Show("b: " + (FindResource("b") as SolidColorBrush).Color.ToString());
次のコードで私のリソースをチェックすると、私はこの結果を得る:
f: #00FFFFFF
e: null
d: null
c: #FFFF0000
b: #FFFF0000
はすなわち、最後の二つは一見正しいです。これの理由は何でしょうか?