隐藏依赖属性

时间:2012-02-16 21:25:26

标签: wpf dependency-properties

只是想知道这是一个好的做法,还是从长远来看会造成任何麻烦。说实话,我很惊讶它甚至可以工作 - 它完成了工作,但我不确定它是否有风险。

基本上我们创建了一个源自NumericTextBox的{​​{1}},我们使用TextBox关键字覆盖Text属性以删除文本中的逗号:

new

我不喜欢它是因为我知道public class NumericTextBox : TextBox { public new string Text { get { return base.Text.Replace(",", String.Empty); } set { base.Text = value; } } } 是一个依赖属性我们正在覆盖它,但令人惊讶的是我们仍然可以在XAML中绑定它:

Text

然后在C#中,当我们调用<this:NumericTextBox x:Name="textBox" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=SomeText, Converter={StaticResource debugConverter}}" /> 时,我们确实得到没有逗号的值。

你们有什么想法?

1 个答案:

答案 0 :(得分:0)

也许你应该add your class as an owner of the dependency property并覆盖那里的getter和setter:

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中的bound属性来尝试它。 setter断点永远不会被击中。但是您可以挂钩依赖项属性元数据提供的事件。