我正在為不同的資料型別撰寫一組自定義的 TextBox 控制元件。我不僅要驗證文本(我這樣做),還要將輸入存盤在適當型別的屬性中。
因此,例如我有一個繼承自 TextBox 的 UnsignedIntegerBox,應該將輸入存盤在“uint UnsignedInteger”屬性中,默認設定在 xaml 中。它驗證 OnPreviewTextInput 事件中的輸入。OnTextChanged 用于從 Text 更新 UnsignedInteger。
問題:有什么方法可以隱藏 TextBox.Text 屬性,使其不會在 XAML 中公開(也不能使用)?
uj5u.com熱心網友回復:
我建議創建可以從 UserControl/Control 類繼承的新 CustomTextbox 類,根據需要在其上創建一個 DP 屬性,并將其系結到控制元件模板/新控制元件內容中的 TextBox。這樣您仍然使用 TextBox 進行輸入/視覺效果,但從代碼點來看,它隱藏在您的新 CustomTextBox 類后面
uj5u.com熱心網友回復:
當您擴展超類時,子類就是超類。您永遠不能洗掉超類的任何成員。您可以通過覆寫虛擬成員或隱藏可訪問成員來更改行為。也許你應該重新審視 C# 等 OO 語言的繼承規則來理解這個概念。
這是您可以做的,其中 3、4、5 是唯一干凈且有用的解決方案:
- 當您隱藏
Text屬性以宣告它時private,由于 XAML 引擎的型別推斷,您將收到 XAML 錯誤。這樣 Text 屬性可通過 Intellisense 獲得,但您無法設定它。但是在 C# 中,選擇了下一個可訪問的成員。成員查找行為將自動排除新隱藏的私有Text屬性,然后查找public超類成員。
class MyTextBox : TextBox
{
// Only has an effect in XAML
new private string Text { get; set; }
}
即使這行得通,您始終可以DependencyProperty使用該DependencyObject.SetValue方法設定靜態。隱藏也只是隱藏而不是移除。您始終可以強制轉換為超類以訪問原始Text屬性。
- 您可以覆寫
DependencyProperty元資料以禁止資料系結
public class MyTextBox : TextBox
{
static MyTextBox()
{
TextBox.TextProperty.OverrideMetadata(
typeof(MyTextBox),
new FrameworkPropertyMetadata(default, FrameworkPropertyMetadataOptions.NotDataBindable));
}
}
如果您嘗試系結到該Text屬性,這將引發例外。
但是您仍然可以通過賦值來設定值。
- 使用組合而不是繼承。您可以根據您的要求設計類 API,并將功能委托給不可訪問的組合型別。
// Alternatively extend Control
class MyTextBox : TextBoxBase
{
private TextBox TextBox { get; }
public int Number
{
get => return this.TextBox.Text;
set
{
if ( IsValid(value))
{
this.TextBox.Text = value;
}
}
}
- 在未宣告不需要的成員的型別層次結構中擴展類。在您的情況下,這將是
TextBoxBase.
// Will not have a Text property
class MyTextBox : TextBoxBase
{
}
- 拋出
NotSupportedException例外使繼承成員無法使用。開發商會立即收到通知,例如,該Text物業不可用。可能不是公共圖書館的最佳解決方案。
public class MyTextBox : TextBox
{
static MyTextBox()
{
TextBox.TextProperty.OverrideMetadata(
typeof(MyTextBoxl),
new FrameworkPropertyMetadata(null, OnCoerceText));
}
private static object OnCoerceText(DependencyObject d, object baseValue)
=> throw new NotSupportedException();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393082.html
上一篇:WPF文本框選擇垂直居中或對齊
