c# - WPF DataContext 在看似相同的情况下工作方式不同

标签 c# wpf data-binding 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 和 Context 定义如下:

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); } }
}

现在,我使用数据上下文和绑定(bind)的方式看起来与我非常相似,但是如果我使用以下代码(在按钮单击处理程序中)检查我的资源

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

即只有最后两个似乎是正确的。这可能是什么原因?

最佳答案

奇怪。

my:C 显然没有 DataContext,因此不能直接绑定(bind)到任何东西。

具有 DataContext 的资源不继承资源所有者的 DataContext(省略号 e 和 f)

SolidColorBrush“b”派生自 System.Windows.Freezable,它有一个名为 InheritanceContext 的 protected 字段/属性,“b”设置为 MainWindow。我认为它可以通过此引用访问 Context.B,这就是“b”和“c”显示正确颜色的原因。

关于c# - WPF DataContext 在看似相同的情况下工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40071760/

相关文章:

c# - EF 的 DatabaseGeneratedOption.Identity 属性不适用于 ulong 类型

c# - set的封装更有效

silverlight - Silverlight 的 BindingBase.Delay

data-binding - Sapui5:当 oData 服务具有 $expand 参数时如何将其绑定(bind)到 SAPUI5 表

c# - 在 ListView UWP 中选择项目时选中复选框

c# - 如何在 C# 中以更短的方式编写 if Else 条件?

c# - 如何将任意方法(或委托(delegate))作为参数传递给函数?

c# - 如何将图像的工具提示绑定(bind)到 XAML 中的异常错误消息?

c# - 如何在WPF中对GridViewColumns进行分组,以便扩展器填充整个宽度

Silverlight数据网格: Binding dynamically to an image source based on an object's property string?