WPF用户控件的依赖属性未绑定。

52 浏览
0 Comments

WPF用户控件的依赖属性未绑定。

我知道有很多类似的问题,过去一天左右我读了很多这样的问题,但没有一个解决方案似乎能帮到我。

我有一个WPF用户控件,基本上是一个功能增强的ComboBox,我想在上面启用数据绑定。我按照这个SO问题中被接受的答案中显示的代码进行了操作,但绑定不起作用。

用户控件内容的简化版本如下所示...


    

显然还有很多内容,但对于我的问题来说并不相关。

在代码后台,我添加了一个名为Text的依赖属性,如下所示...

public static readonly DependencyProperty TextProperty
         = DependencyProperty.Register("Text", typeof(string),
  typeof(MyComboBox), new FrameworkPropertyMetadata() {
    BindsTwoWayByDefault = true,
    PropertyChangedCallback = TextChanged,
    DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
  });
private static void TextChanged(DependencyObject d,
                             DependencyPropertyChangedEventArgs e) {
  MyComboBox cmb = (MyComboBox)d;
  cmb.EntityTb.Text = e.NewValue.ToString();
}
public string Text {
  get => (string)GetValue(TextProperty);
  set => SetValue(TextProperty, value);
}

然后我尝试在一个WPF窗口上使用它。视图模型有一个Customer属性,该属性具有一个Name属性,我想将其绑定到自定义控件上...


Customer属性只是一个简单的...

private Customer _customer;
public Customer Customer {
  get => _customer;
  set {
    if (_customer != value) {
      _customer = value;
      RaisePropertyChanged();
    }
  }
}

...而Customer类型本身只是一个普通的C#类...

public partial class Customer {
  public string Name { get; set; }
}

然而什么都没有发生。当窗口加载时,客户名称不显示在组合框中,如果我在那里输入任何内容,模型不会更新。

我做了很多搜索,所有的代码示例似乎都像上面那样。有人能告诉我我做错了什么吗?

0
0 Comments

问题原因:在属性更改回调函数中更新cmb.EntityTb.Text只能实现单向绑定,无法实现双向绑定。

解决方法:使用双向绑定的方式来更新ComboBox的Text属性。

具体步骤如下:

1. 将ComboBox的IsEditable属性设置为True,以使其可编辑。

2. 使用以下代码将Text属性绑定到UserControl的Text属性上:


3. 由于ComboBox的Text属性默认就是双向绑定的,因此不需要显式设置Mode=TwoWay。

通过以上步骤,即可解决WPF中User Control的Dependency Property无法实现双向绑定的问题。

0