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

时间:2018-02-21 20:20:02

标签: c# wpf mvvm data-binding

我有一个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?绑定是否可以直接引用基类或接口的属性?

2 个答案:

答案 0 :(得分:1)

  

如何绑定Message定义的IMessage属性,而不是A.Message?绑定是否可以直接引用基类或接口的属性?

当您需要绑定到隐藏的属性或名称不明确的属性时,您需要使用 type-qualified 属性路径语法。

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

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

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

答案 1 :(得分:0)

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

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