如何使DependencyProperty正确强制绑定

时间:2015-09-10 19:34:21

标签: c# wpf xaml binding

我有一个ItemsControl子类,其行为类似于Selector,但它不能成为Selector的子类,因为所选项目不是Items。必须在Selector集合中。所以我不得不重新实现很多SelectedValuePath的东西。

我的班级有SelectedItem属性。如果该属性具有值,我创建一个绑定,以便在"SelectedItem." + SelectedValuePath更改时,SelectedValue的值被分配给SelectedValue。这非常有效 - 只要消费者将SelectedItem绑定到与int ID上的value属性相同类型的属性

问题在于:

但是,如果所选项目的SelectedValue属性被用作值属性,并且Nullable<int> SelectedID绑定到视图模型上的SelectedItem属性,绑定无法在视图模型上设置属性,除非ComboBox为空。

我注意到WPF CoerceValueCallback类没有这个问题,因此它必须是可解决的,而不需要消费者提供值转换器。我试过了ComboBox.SelectedValue并且没有为我做任何事情。它不知道目标类型。它没有关于接收该值的绑定的信息。

IValueConverter做什么我不是吗?

我非常熟悉ComboBox.SelectedValue以及如何在使用控件的位置将值转换器添加到XAML中的绑定中。我不需要帮助。我询问是否有人知道intint?转换为range的约束情况如何,而控件的使用者不会在绑定中添加值转换器。

1 个答案:

答案 0 :(得分:0)

正如我所料,问题并非我所期望的。没有类型转换问题。

看来问题是我班上的内部问题。我正在使用绑定更新SelectedValue

Binding binding = new Binding("SelectedItem." + SelectedValuePath);
binding.Mode = BindingMode.OneWay;
binding.Source = this;
BindingOperations.SetBinding(this, MenuComboBox.SelectedValueProperty, binding);

这似乎干扰了消费者对SelectedValue的双向约束。

我有BindingTarget类派生自DependencyObject。它会公开一个名为DependencyProperty的{​​{1}},并在Value更改时触发一个事件。我已将其编写为将值转发给“只读”Value DependencyProperty,其中setter受到保护。因此,我没有使用SelectionBoxItem作为目标"SelectedItem."+SelectedValuePath创建绑定,而是使用私有SelectedValue实例作为目标,并在其{{1}中设置BindingTarget处理程序。消费者的绑定现在按预期工作。

SelectedValue