爲什麼當我在文本框中輸入文本時,調用後的Coerce函數調用了 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();
}
}
}
問題是,當你輸入文本時,該值被寫入到Float而沒有經過「Value」的強制函數,當Text被綁定到Value時它沒有任何意義,所以它應該先通過Value。它的行爲就像文本直接綁定到Float – pastillman
爲了更加清晰,我編輯了答案。 – DaClan