2009-12-23 84 views
2

这里的情况:我有一个自定义的TextBox控件,其中包含多个其他TextBox控件。我需要在父控件中关闭IsTabStop,但我仍然想要公开一个新的IsTabStop属性,该子属性框是模板绑定的。我写了下面的代码:Silverlight DependencyProperty问题

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

DependencyProperty系统独立于C#属性获取器和设置器运行,这些属性获取器和设置器是作为程序员的一个便捷提供的。

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

+0

有没有办法解决这个问题?我认为通过定义一个“新”静态依赖项属性并注册它,它将像其他面向对象的工具一样行为并隐藏父类的成员。这在另一个例子中适用于我,当时我改变了一个新的依赖属性的类型,但保留了它的名字。 – Dov 2009-12-24 13:22:03

0

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

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

+0

但它在XAML中定义为CustomTextBox,而不是控件。你说什么可能看不到新的类型? – Dov 2009-12-24 19:38:56