0

我创建了一个非常简单的用户控件,它显示了一个ColorPicker(来自 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>

这是支持代码:

public partial class HexColorPicker : UserControl
{
    public static readonly DependencyProperty SelectedColorProperty
        = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(HexColorPicker));

    public HexColorPicker()
    {
        InitializeComponent();
        layoutRoot.DataContext = this;
    }

    public Color SelectedColor
    {
        get { return (Color)GetValue(SelectedColorProperty); }
        set { SetValue(SelectedColorProperty, value); }
    }
}

layoutRoot.DataContext恶作剧来自我发现的这个地方。

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

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

它有点工作。文本字段和颜色选择器是同步的:当一个改变时,另一个也改变。但是,控件和模型对象不是双向同步的:如果我更改模型对象的MyColor属性,我的控件将更新,MyColor但当我用我的控件更改它时,该属性不会更新。

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

4

2 回答 2

3

将您的 DependencyProperty 声明更改为:

public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
于 2013-03-04T21:20:19.490 回答
0

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

从 BindingMode.Default ( http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx ) 的参考资料:

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

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

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

于 2013-03-04T21:22:50.400 回答