using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Test.Decorator { /// /// WinDecorator.xaml 的交互逻辑 /// public partial class WinDecorator : Window { public WinDecorator() { InitializeComponent(); Items = new List(); this.Value = "1"; for (int i = 0; i < 1000; i++) { Items.Add("adada" + i.ToString()); } this.DataContext = this; this.Loaded += WinDecorator_Loaded; } private void WinDecorator_Loaded(object sender, RoutedEventArgs e) { //Spinner.CommitInput(); } private void IntegerSpinner_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { var old = e.OldValue; var newV = e.NewValue; } public List Items { get; set; } public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { }; protected void RaisePropertyChanged(String propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private string m_Value; /// /// 值信息 /// public string Value { get { return this.m_Value; } set { this.m_Value = value; RaisePropertyChanged(nameof(this.Value)); if (Spinner != null) { var cc = Spinner.Value; } } } #region 测试绑定顺序 /* * 可以说该控件双向绑定支持的并不好,这是一个前提,因为涉及到一些强制约束,又自定义了一些触发只改变的条件; * 有些控件,双向绑定支持的都不是太好 * * 给控件的Value赋值时,SetValue();先触发后台的绑定属性,再触发静态的force回调, changed回调 * * 所以直接使用这种形式去处理事件会出问题 * * 推荐使用前台ValueChanged事件,或者绑定Text加提交方式KeyDown模式处理; * 第二种方式,又造成了控件初始化的时候需要手动提交一次,【后台绑定的值才能传递到界面上显示】 * * */ #endregion } }