C# 我的WPF用户控件具有单向绑定,而我没有';我不知道为什么

C# 我的WPF用户控件具有单向绑定,而我没有';我不知道为什么,c#,wpf,data-binding,user-controls,C#,Wpf,Data Binding,User Controls,我创建了一个非常简单的用户控件,它显示了一个颜色选择器(来自WPF扩展工具包)及其十六进制代码的文本字段: <UserControl x:Class="HexColorPicker"> <!-- namespace declarations omitted --> <UserControl.Resources> <glue:ColorToRgbHex x:Key="colorToHex"/> <!-- custom c

我创建了一个非常简单的用户控件,它显示了一个
颜色选择器
(来自WPF扩展工具包)及其十六进制代码的文本字段:

<UserControl x:Class="HexColorPicker"> <!-- namespace declarations omitted -->
    <UserControl.Resources>
        <glue:ColorToRgbHex x:Key="colorToHex"/> <!-- custom converter I made -->
    </UserControl.Resources>
    <StackPanel Orientation="Horizontal" Name="layoutRoot">
        <Label Content="#"/>
        <TextBox Text="{Binding SelectedColor, Converter={StaticResource colorToHex}}"/>
        <extToolkit:ColorPicker SelectedColor="{Binding SelectedColor}"/>
    </StackPanel>
</UserControl>
layoutRoot.DataContext
骗局来自于

然后我像这样使用我的控件:

<me:HexColorPicker SelectedColor="{Binding MyColor}"/>

而且它在某种程度上是有效的。文本字段和颜色选择器是同步的:当一个更改时,另一个也会更改。但是,控件和模型对象不是双向同步的:如果我更改模型对象的
MyColor
属性,我的控件将更新,但是当我使用控件更改
MyColor
属性时,它不会更新


我做错了什么?为什么从我的模型到我的控件的绑定是单向的?

将DependencyProperty声明更改为:

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

将DependencyProperty声明更改为:

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
我记得,在类型之间转换的绑定有时默认为单向绑定

从BindingMode.Default()的引用中:

使用绑定目标的默认模式值。每个依赖项属性的默认值都不同。通常,用户可编辑控件属性(如文本框和复选框的属性)默认为双向绑定,而大多数其他属性默认为单向绑定。确定依赖项属性在默认情况下是单向绑定还是双向绑定的编程方法是使用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值

看起来问题在于您的控件没有被视为“用户可编辑”控件


最简单的解决方案是在绑定中指定
Mode=TwoWay

我记得,在类型之间转换的绑定有时默认为
单向
绑定

从BindingMode.Default()的引用中:

使用绑定目标的默认模式值。每个依赖项属性的默认值都不同。通常,用户可编辑控件属性(如文本框和复选框的属性)默认为双向绑定,而大多数其他属性默认为单向绑定。确定依赖项属性在默认情况下是单向绑定还是双向绑定的编程方法是使用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值

看起来问题在于您的控件没有被视为“用户可编辑”控件


最简单的解决方案是在绑定中指定
Mode=TwoWay

我有点惊讶于微软的人认为默认情况下不应该是双向的。@zneak有很多情况下
TwoWay
没有真正意义。我真的想不出任何控件想要修改属性的情况但不将其同步回模型。我可以想象,对于控件本身不会更改的属性,使用双向绑定是没有用的,但正因为如此,它也不会有害。@zneak我想单向绑定比双向绑定更轻量级。而且只有单向的属性的百分比比它的对应属性大。我有点惊讶,微软的人认为默认情况下不应该是双向的。@zneak有很多情况下,
TwoWay
没有真正意义。我真的想不出任何控件想要修改属性,但不将其同步回模型。我可以想象,对于控件本身不会更改的属性,使用双向绑定是没有用的,但正因为如此,它也不会有害。@zneak我想单向绑定比双向绑定更轻量级。而且,仅单向有效的属性的百分比大于其对应属性的百分比。“最简单的解决方案是在绑定中指定Mode=TwoWay”。那是错误的。如果希望依赖项属性在默认情况下双向绑定,唯一的方法是设置
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
标志,如另一个答案所示。重新考虑默认情况下的部分。“最简单的解决方案是在绑定中指定Mode=TwoWay”。那是错误的。如果希望依赖项属性在默认情况下双向绑定,唯一的方法是设置
FrameworkPropertyMetadataOptions.bindstwayByDefault
标志,如另一个答案所示。重新考虑默认部分。