绑定到基类型上的阴影属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绑定到基类型上的阴影属性相关的知识,希望对你有一定的参考价值。

我有一个WPF问题,我想绑定到我的视图模型的基类上的属性,但视图模型隐藏该属性。

我的视图模型层次结构如下所示:

public class A : B {
    public new string Message => "This message will be on the screen.";
}

public class B : IMessage {
    public string Message => "This message won't be on the screen.";
}

public interface IMessage {
    string Message { get; }
}

我想绑定到由Message定义的IMessage属性,它被绑定到B.Message。但是,我的视图模型是A的一个实例,而A.Message隐藏了该属性。正如所料,一个天真的绑定解决了A.Message

<TextBlock Text="{Binding Message}" />  <!-- Binds to A.Message -->

我怎样才能绑定Message定义的IMessage属性,而不是A.Message?绑定是否可以直接引用基类或接口的属性?

答案

我怎样才能绑定Message定义的IMessage属性,而不是A.Message?绑定是否可以直接引用基类或接口的属性?

当您需要绑定到隐藏的属性或具有不明确的名称时,您需要使用类型限定的属性路径语法。

包含隐藏或不明确属性的路径段必须括在括号中,并且必须预先设置类型限定符。理想情况下,类型限定符将用于声明属性的类型,但它只需要是属性可见且明确的类型。在您的情况下,以下任何一个都应该工作:

<TextBlock Text="{Binding Path=(local:IMessage.Message)}" />
<TextBlock Text="{Binding Path=(local:B.Message)}" />

当您需要绑定到显式实现的接口属性时,或者在类似于您的接口属性的情况下,这会派上用场,其中您想要的属性被子类中具有相同名称的属性所遮蔽。它也是用于绑定到附加属性的语法。

另一答案

您可以使用特定于接口的实现,如下所示:

interface IA
{
    string Message { get; }
}

interface IB
{
    string Message { get; }
}

class A : B, IA
{
    string IA.Message { get { return "Foo"; }}
}

class B : IB
{
    string IB.Message { get { return "Bar"; }}
}

public class Program
{
    public static void Main()
    {
        IA a = new A();
        IB b = a as IB;

        Console.WriteLine(a.Message);
        Console.WriteLine(b.Message);
    }
}

输出:

Foo
Bar

Code on DotNetFiddle

以上是关于绑定到基类型上的阴影属性的主要内容,如果未能解决你的问题,请参考以下文章

AMD 上的慢模板纹理

将 PropertyChangedCallback 添加到基类的只读依赖属性

将默认构造函数添加到基类会更改sizeof()派生类型[duplicate]

如何初始化片段中的绑定属性以使双向数据绑定工作

css有用的代码片段

绑定属性上的 DataTrigger