Dependency Property未更新绑定值(MVVM-Helper)问题求助
WPF自定义UserControl双向绑定失效问题解决
问题根源分析
你的代码里有三个关键错误导致双向绑定失效:
窗口中未建立绑定,仅做一次性赋值
你在创建UserControl时直接写CommentToAdd = _vm.CommentToAdd,这只是把ViewModel当前的值拷贝给UserControl,没有建立双向绑定关系,所以UserControl的属性变化无法同步回ViewModel。DependencyProperty回调函数逻辑错误
OnCommentChange里调用myUC.CommentToAdd = comment会触发循环赋值(设置属性会再次触发回调),而且DependencyProperty本身会自动维护属性值,不需要手动赋值。另外,DependencyProperty自带属性变化通知,不需要额外调用RaisePropertyChanged。多余的INotifyPropertyChanged实现
自定义UserControl的DependencyProperty本身就支持属性变化通知,不需要额外实现INotifyPropertyChanged接口。
修正后的代码
MyUserControl后台代码
public partial class MyUserControl : UserControl { public MyUserControl() { InitializeComponent(); } public static readonly DependencyProperty CommentToAddProperty = DependencyProperty.Register( nameof(CommentToAdd), typeof(string), typeof(MyUserControl), new FrameworkPropertyMetadata( default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public string CommentToAdd { get => (string)GetValue(CommentToAddProperty); set => SetValue(CommentToAddProperty, value); } }
SomeWindow后台代码
public partial class SomeWindow : Window { private MyViewModel _vm; public SomeWindow() { InitializeComponent(); _vm = new MyViewModel(); DataContext = _vm; var userControl = new UserControls.MyUserControl(); // 用绑定替代直接赋值,建立双向同步关系 BindingOperations.SetBinding(userControl, MyUserControl.CommentToAddProperty, new Binding(nameof(MyViewModel.CommentToAdd)) { Source = _vm, Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }); // 将UserControl添加到Grid(替换成你的Grid名称) targetGrid.Children.Add(userControl); } }
UserControl的XAML(无需修改)
<TextBox Grid.Column="0" Text="{Binding Path=CommentToAdd, Mode=TwoWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MyUserControl}, UpdateSourceTrigger=PropertyChanged}"/>
验证方法
运行程序后:
- 修改TextBox的文本,ViewModel的
CommentToAdd属性会同步更新 - 在ViewModel中手动设置
CommentToAdd的值,TextBox也会同步显示新内容
内容的提问来源于stack exchange,提问作者psclp
相关产品推荐
相关产品推荐

