为什么当我在文本框中输入文本时,在调用MainWindow.Float.Set之后调用 Coerce 函数?
输入文本后,我会期望:
OnValueCoerce -> OnValueChanged -> MainWindow.Float.Set
但我得到:
MainWindow.Float.Set -> OnValueCoerce -> OnValueChanged
<Window x:Class="WpfApplication10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:WpfApplication10"
Title="MainWindow" Height="350" Width="525">
<l:TextBoxEx Value="{Binding Float, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Window>
...
namespace WpfApplication10
{
public class TextBoxEx : TextBox
{
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(TextBoxEx),
new UIPropertyMetadata(double.NaN, OnValueChanged, OnValueCoerce));
static object OnValueCoerce(DependencyObject _dep, object _value)
{
return _value;
}
static void OnValueChanged(DependencyObject _obj, DependencyPropertyChangedEventArgs _arg)
{
int gotHere = 6;
}
public TextBoxEx()
{
var binding = new Binding("Value")
{
Source = this,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
Mode = BindingMode.TwoWay
};
SetBinding(TextBox.TextProperty, binding);
}
}
public partial class MainWindow : Window
{
float m_float = 7.812345678f;
public float Float
{
get { return m_float; }
set { m_float = value; }
}
public MainWindow()
{
DataContext = this;
InitializeComponent();
}
}
}