Silverlight DependencyProperty问题

时间:2009-12-23 20:27:38

标签: c# silverlight xaml oop dependency-properties

以下是这种情况:我有一个自定义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吗?

发生了什么事?

2 个答案:

答案 0 :(得分:2)

DependencyProperty系统独立于C#属性getter和setter运行,它们是为程序员提供的便利。

WPF / Silverlight将直接读取Control.IsTabStopProperty,不会使用CustomTextBox.IsTabStop属性或CustomTextBox.IsTabStopProperty DependencyProperty。

答案 1 :(得分:0)

我怀疑您需要查看“隐藏”父类型成员时实际发生的情况。使用父类型的任何代码都不会看到您的新定义,它将继续使用父类定义的现有成员。只有针对新派生类型编写的代码才会开始使用新定义。

在这种情况下,当您对自定义控件的引用保持为Control类型时,对IsTabStop的任何访问都将返回Control中的实现。只有当代码知道它对类型CustomTextBox起作用时,它才会使用您的自定义定义。