只是想知道这是一个好的做法,还是从长远来看会造成任何麻烦。说实话,我很惊讶它甚至可以工作 - 它完成了工作,但我不确定它是否有风险。
基本上我们创建了一个源自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}}" />
时,我们确实得到没有逗号的值。
你们有什么想法?
答案 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断点永远不会被击中。但是您可以挂钩依赖项属性元数据提供的事件。