我正在使用WPF扩展工具包的属性编辑器,我需要使用该工具包附带的颜色编辑器添加对编辑System.Drawing.Color
的支持。
当前的颜色编辑器通过颜色选择器组件完成它的工作,并且似乎使用数据绑定将颜色选择器的SelectedColor
属性直接连接到被编辑对象的颜色属性。不幸的是,Toolkit的编辑器是通过返回一个要绑定到的DependencyProperty
来实现的,而不是被要求自己绑定它,所以我似乎不能在那里插入(绝对微不足道的)类型转换。
我只看到另外两种方法:
- 复制整个颜色选择器,改变它编辑的属性的类型。这是我最不想做的事情,原因很明显。
- 从颜色选择器中暴露第二个颜色属性,类型为
System.Drawing.Color
,这样我的新颜色编辑器就可以告诉属性网格绑定到那个属性。但是有人告诉我,拥有两个具有相同底层值的依赖属性是一个糟糕的主意。
有更好的方法吗?
如果我真的应该在Color Picker组件中公开两种颜色属性,那么保持它们"同步"的正确方法是什么?
您可以使用值转换器将数据绑定到System.Drawing.Color
。
public class SystemDrawingColorConverter : IValueConverter
{
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
System.Windows.Media.Color color = (System.Windows.Media.Color)value;
return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
System.Drawing.Color color = (System.Drawing.Color)value;
return System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B);
}
}
XAML: <Grid>
<Grid.Resources>
<local:SystemDrawingColorConverter x:Key="converter" />
</Grid.Resources>
<Grid.DataContext>
<local:VM />
</Grid.DataContext>
<tk:ColorPicker SelectedColor="{Binding Color, Converter={StaticResource converter}}" />
</Grid>
测试视图模型的代码:
public class VM
{
private System.Drawing.Color _color;
public System.Drawing.Color Color
{
get { return _color; }
set { _color = value; }
}
}