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

时间:2019-03-11 20:19:39

标签: c# wpf xaml dependency-properties

我知道有很多类似的问题,在过去的一天左右的时间里,我读了很多类似的问题,但是似乎没有一种解决方案对我有帮助。

我有一个WPF用户控件,基本上是一个增强的ComboBox,我想在其上启用数据绑定。我按照this SO question的可接受答案中显示的代码进行操作,但是绑定无效。

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

<UserControl x:Class="Sample.MyComboBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ComboBox Name="EntityTb"
              IsEditable="True" />
</UserControl>

显然还有很多,但其余与我的问题无关。

在后面的代码中,我添加了一个名为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属性。

<controls:MyComboBox Grid.Column="1"
     Text="{Binding Customer.Name, Mode=TwoWay}" />

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; }
}

但是什么也没发生。加载窗口时,组合框中不会显示客户名称,并且如果我在其中键入任何内容,则不会更新模型。

我已经做了很多搜索,所有代码示例看起来都像上面的示例。有人能告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

在PropertyChangedCallback中更新cmb.EntityTb.Text仅在一个方向上有效。

相反,请使用双向绑定,例如

<ComboBox IsEditable="True"
    Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

由于ComboBox.Text属性在默认情况下也会双向绑定,因此设置Mode=TwoWay是多余的。