2012-02-16 28 views
2

これは良い習慣であるか、長期的には何らかのトラブルを引き起こす可能性があるのか​​どうか疑問に思うだけです。正直言って、私はそれが働いても驚いています - それは仕事をしますが、それが危険なのかどうかはわかりません。依存関係プロパティを隠す

基本的に我々はTextBoxから派生NumericTextBoxを作成し、私たちはテキストからカンマを削除するnewキーワードでTextプロパティをオーバーライド:私はそれについて好きではない何

public class NumericTextBox : TextBox 
{ 
    public new string Text 
    { 
     get 
     { 
      return base.Text.Replace(",", String.Empty); 
     } 
     set 
     { 
      base.Text = value; 
     } 
    } 
} 

は、私が知っているということですTextは、依存関係プロパティであり、我々はそれをオーバーライドしているが、意外にも、我々はまだXAMLでそれに特異的に結合することができます。

<this:NumericTextBox x:Name="textBox" 
        Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=SomeText, Converter={StaticResource debugConverter}}" /> 

そして、C#で、我々はを呼び出すときにカンマなしの値を取得します。

あなたはどう思いますか?

答えて

0

はおそらく、あなたはadd your class as an owner of the dependency property必要があり、そこにゲッターとセッターをオーバーライドします。

public class NumericTextBox : TextBox 
{ 
    public NumericTextBox() { } 
    public static readonly DependencyProperty NumericTextProperty = TextBox.TextProperty.AddOwner(typeof(NumericTextBox), new PropertyMetadata(null)); 
    public new string Text 
    { 
     get { return ((string)this.GetValue(NumericTextProperty)).Replace(",", String.Empty); } 
     set { this.SetValue(NumericTextProperty , value); } 
    } 
} 

をあなたはまた、カスタム検証コールバックメソッドにフックするoverriding the metadata of the dependency propertyの可能性を持っています。

WPFは実際にはクラスプロパティを使用して値を変更するのではなく、依存関係プロパティシステムを使用するため、アプローチは機能しません。これは、プロパティセッターで行うように、単にSetValueメソッドを呼び出します。 setterでブレークポイントを設定し、guiのバウンドプロパティを変更することで試してみることができます。セッターブレークポイントは決してヒットしません。しかし、依存関係プロパティのメタデータによって提供されるイベントにフックすることができます。

+0

隠蔽が意図されていた場合、「new」キーワードを使用しないことについて文句を言っています。追加しようとしましたが、例外があります。 Textプロパティなどのために機能するようになりました。 – Carlo

+0

余分な情報をありがとう。しかし、それは良い習慣か、それとも避けなければならないのでしょうか?そしてなぜあなたが知っていれば、それはあまりにも助けになるでしょう。 – Carlo

+0

このコードは正常に動作しますか?ここでは実行時例外が発生します:http://screencast.com/t/EbiYg14f – Carlo

関連する問題