2009-12-23 82 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