我创建了一个非常简单的用户控件,显示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
恶作剧来自this place I found。
<me:HexColorPicker SelectedColor="{Binding MyColor}"/>
它有点奏效。文本字段和颜色选择器是同步的:当一个更改时,另一个也会更改。但是,控件和模型对象不是双向同步的:如果我更改模型对象的MyColor
属性,我的控件将更新,但是当我使用my更改它时,MyColor
属性将不会更新控制。
我做错了什么?为什么从我的模型单向绑定到我的控制?
答案 0 :(得分:3)
将您的DependencyProperty声明更改为:
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof (Color), typeof (HexColorPicker), new FrameworkPropertyMetadata(default(Color),FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
答案 1 :(得分:0)
我记得,在类型之间转换的绑定有时默认为 OneWay
绑定。
来自BindingMode.Default(http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx)的参考:
使用绑定目标的默认模式值。每个依赖项属性的默认值都不同。通常,用户可编辑的控件属性(例如文本框和复选框的属性)默认为双向绑定,而大多数其他属性默认为单向绑定。确定依赖项属性是默认绑定单向还是双向的一种编程方法是使用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。
看起来问题是您的控件不被视为“用户可编辑”控件。
最简单的解决方案是在绑定中指定Mode=TwoWay
。