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

问题描述 投票:0回答:2

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

c# wpf mvvm data-binding
2个回答
1
投票

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

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

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.