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

C# 绑定到基类型上的阴影属性,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,我有一个WPF问题,我想绑定到视图模型基类上的属性,但是视图模型隐藏了该属性 我的视图模型层次结构如下所示: 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.Messag

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

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

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);
    }
}
公共A类:B类{
public new string Message=>“此消息将显示在屏幕上。”;
}
B类公共信息:IMessage{
公共字符串消息=>“此消息将不在屏幕上。”;
}
公共接口IMessage{
字符串消息{get;}
}
我想绑定到由
IMessage
定义的
Message
属性,该属性被绑定到
B.Message
。但是,我的视图模型是
A
的一个实例,而
A.Message
隐藏了该属性。正如所料,原始绑定解析为
a.Message



如何绑定到由
IMessage
定义的
Message
属性,而不是
A.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

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

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

包含隐藏或不明确属性的路径段必须用括号括起来,并且必须在前面加上类型限定符。理想情况下,类型限定符将用于声明属性的类型,但它只需要是属性可见且明确的类型。在您的情况下,以下任一项都应起作用:



当您需要绑定到显式实现的接口属性时,或者在类似您的情况下,您想要的属性被子类中同名属性隐藏时,这非常方便。这也是绑定到附加属性时使用的语法。

是否在不同时刻使用类A和B作为viewmodel?我在另一个视图中使用基类。A类的视图比B类的视图更为特殊,但我不想创建另一个视图模型,因为它们有许多公共部分,并且由于同一个接口而具有相同的属性名称。只需在属性路径中键入所需的属性:
{Binding path=(local:IMessage.Message)}
。或者,如果
A
直接(重新)实现
IMessage
,则使用
(本地:B.Message)
。成功了。在WPF工作了3年,我不知道这一点。感谢分享。投票重新开放,因为这实际上是一个非常好的问题,有明确的答案,但是
iba=newa()将显示
,而不是
Foo
。关键是
new
关键字不是多态性。很抱歉,在我的实际项目中,我不应该使用不同的接口。“我的手被绑住了。”