我就是找不到丢失的那一块。我的 UserControl 不更新绑定属性。我正在后面的代码中创建一个新的用户控件。 SetValue 和 GetValue 方法被调用。如果 viewModel 正在初始化某个值,我的 UserControl 就会获取它。但是如果我更改文本框中的文本,视图模型将不保留该值。
我的代码:
public partial class MyUserControl : UserControl, INotifyPropertyChanged
{
public MyUserControl()
{
InitializeComponent();
}
public static readonly DependencyProperty CommentToAddProperty=
DependencyProperty.Register(
nameof(CommentToAdd),
typeof(string),
typeof(MyUserControl),
new FrameworkPropertyMetadata(
default(string),
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnCommentChange));
public string CommentToAdd
{
get => (string)GetValue(CommentToAddProperty);
set => SetValue(CommentToAddProperty, value);
}
private static void OnCommentChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var myUC = d as MyUserControl;
var comment = e.NewValue as string;
myUC.CommentToAdd = comment;
myUC.RaisePropertyChanged(nameof(CommentToAdd));
}
public partial class SomeWindow: Window
{
public SomeWindow()
{
InitializeComponent();
_vm = new MyViewModel();
DataContext = _vm;
var userControl = new UserControls.MyUserControl
{
CommentToAdd = _vm.CommentToAdd,
}
\\Add usercontrol to a grid
}
}
public partial class MyViewModel : ObservableObject
{
[ObservableProperty]
private string _commentToAdd;
}
这是我的 UserControl 中的 XAML 代码
<TextBox
Grid.Column="0"
Text="{Binding Path= CommentToAdd, Mode=TwoWay,
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType=local:MyUserControl},
UpdateSourceTrigger=PropertyChanged}"/>
作业
CommentToAdd = _vm.CommentToAdd
不建立 CommentToAdd 属性的数据绑定。
为了创建绑定,您必须编写
userControl.SetBinding(
MyUserControl.CommentToAddProperty,
new Binding("CommentToAdd"));