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