首先关于数据绑定的基础知识,参见官方文档:https://docs.microsoft.com/en-us/dotnet/desktop-wpf/data/data-binding-overview
从上面文档中可以看出,数据绑定是在DependencyProperty与ViewModel的Property之间一种联系。
所以我们需要在自定义控件里实现DependencyProperty, 在ViewModel上实现Property,即拥有get、set方法的字段。还有INotifyPropertyChanged : https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifypropertychanged?redirectedfrom=MSDN&view=netframework-4.8
在使用framework里的控件时,我们一般不会指定BindingMode: https://docs.microsoft.com/en-us/dotnet/api/system.windows.data.bindingmode?view=netframework-4.8#System_Windows_Data_BindingMode_TwoWay
因为大部分控件都是默认TwoWay。
注意,这个默认,其实就是在framework里显示指定了TwoWay。
所以当我们的自定义控件的DependencyProperty没有被更新的时候,考虑要设置BindingMode
BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
完整的代码,以Progress属性为例:
public int Progress { get { return (int)GetValue(ProgressProperty); } set { SetValue(ProgressProperty, value); } } public static readonly DependencyProperty ProgressProperty = DependencyProperty.Register("Progress", typeof(int), typeof(MyUserControl), new FrameworkPropertyMetadata(0, OnProgressChangedCallback, OnProgressCoerceValueCallback) { BindsTwoWayByDefault = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
参考资料: