绑定到基类型上的阴影属性
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
以上是关于绑定到基类型上的阴影属性的主要内容,如果未能解决你的问题,请参考以下文章
将 PropertyChangedCallback 添加到基类的只读依赖属性