以下是这种情况:我有一个自定义TextBox控件,其中包含多个其他TextBox控件。我需要在父控件中关闭IsTabStop,但我仍然希望公开一个新的IsTabStop属性,子文本框是模板绑定的。我写了以下代码:
using System.Windows.Controls;
public class CustomTextBox : Control {
public CustomTextBox() {
base.IsTabStop = false;
}
[Description( "Gets or sets whether a control is included in tab navigation." )]
[Category( "Common Properties" )]
public new bool IsTabStop
{
get { return (bool)GetValue( IsTabStopProperty ); }
set { SetValue( IsTabStopProperty, value ); }
}
public new static readonly DependencyProperty IsTabStopProperty = DependencyProperty.Register(
"IsTabStop",
typeof( bool ),
typeof( CustomTextBox ),
new PropertyMetadata( true ) );
}
但这会导致奇怪的行为。如果没有为自定义控件的实例指定IsTabStop,则它的行为类似于IsTabStop为false,即使默认值为true。但是,如果IsTabStop显式标记为true,则基类的IsTabStop设置为true。此外,如果我将“IsTabStop”和所有相关文本(包括绑定)重命名为“IsTabStopx”,从而不隐藏基本成员,它可以按需运行。一个隐藏的成员不应该像一个全新的定义一样吗?某处某处可以读取基类的IsTabStop吗?
发生了什么事?
答案 0 :(得分:2)
DependencyProperty系统独立于C#属性getter和setter运行,它们是为程序员提供的便利。
WPF / Silverlight将直接读取Control.IsTabStopProperty,不会使用CustomTextBox.IsTabStop属性或CustomTextBox.IsTabStopProperty DependencyProperty。
答案 1 :(得分:0)
我怀疑您需要查看“隐藏”父类型成员时实际发生的情况。使用父类型的任何代码都不会看到您的新定义,它将继续使用父类定义的现有成员。只有针对新派生类型编写的代码才会开始使用新定义。
在这种情况下,当您对自定义控件的引用保持为Control
类型时,对IsTabStop
的任何访问都将返回Control
中的实现。只有当代码知道它对类型CustomTextBox
起作用时,它才会使用您的自定义定义。