Проблемы с Silverlight DependencyProperty - PullRequest
       325

Проблемы с Silverlight DependencyProperty

2 голосов
/ 23 декабря 2009

Вот ситуация: у меня есть пользовательский элемент управления 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 ]

2 голосов
/ 24 декабря 2009

Система DependencyProperty работает независимо от методов получения и установки свойств C #, которые предоставляются для удобства программиста.

WPF / Silverlight будет непосредственно считывать Control.IsTabStopProperty и не будет использовать свойство CustomTextBox.IsTabStop или CustomTextBox.IsTabStopProperty DependencyProperty.

0 голосов
/ 24 декабря 2009

Я подозреваю, что вам нужно проверить, что на самом деле происходит, когда вы "скрываете" член родительского типа. Любой код, который использует родительский тип, не увидит ваше новое определение, он будет продолжать использовать существующий элемент, определенный родителем. Только код, написанный против вашего нового производного типа, начнет использовать новое определение.

В этом случае, когда ссылка на ваш пользовательский элемент управления имеет тип Control, любой доступ к IsTabStop вернет реализацию в Control. Только когда код узнает, что работает против типа CustomTextBox, он будет использовать ваше пользовательское определение.

...