使用DataGridTemplateColumn和Rectangle制作颜色选择器Color
2017-01-13 16:20
471 查看
当前做的项目需要对曲线颜色进行设置,曲线显示在DataGrid中。
先说一下错误情况。
一开始我使用DataGridComboBoxColumn代码如下:
绑定的效果如下:
存在的问题就是:curveName列和lineThickness是可以正确绑定的。(curveName和lineThickness是DataGrid的另外两列,我上边的代码没有复制上去。)lineColor列是根据ObjectDataProvider 提供的Rectangle显示颜色选择器。它的选项也可以填充各种颜色,但是在加载时lineColor列不显示相应的颜色,选中时再点击空白的地方也会消失。
通过使用VS2015中的Live Visual Tree工具观察发现DataGridComboBoxColumn 的非编辑状态的DataGridCell内容是TextBlock类,与想要的Rectangle不符。所以转换思路使用DataGridTemplateColumn。
下面是正确的情况:
其中的DataTemplate和EditingDataTemplate是这样的:
colorBrushes请看错误的情况。
其中color2BrushConverter如下:
color2RectangleConverter如下:
效果如下:
问题出在Rectangle的Fill绑定的是System.Windows.Media.Color类,这是不行的,必须是Brush类。思路来自
https://stackoverflow.com/questions/5474828/adding-a-small-coloured-rectangle-in-datagrid-cell/5474889#5474889
点击打开链接
先说一下错误情况。
一开始我使用DataGridComboBoxColumn代码如下:
<DataGrid ItemsSource="{Binding CurveSettingList,ElementName=curveSetWin}" AutoGenerateColumns="False" IsReadOnly="False" CanUserSortColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" LoadingRow="dataGrid_LoadingRow" AlternationCount="2"> <DataGrid.Columns> <DataGridComboBoxColumn Header="{DynamicResource lineColor}" MinWidth="60" ItemsSource="{Binding Source={StaticResource colorBrushes}}" SelectedValueBinding="{Binding LineColor, Converter={StaticResource color2RectangleConverter}}" SelectedItemBinding="{Binding LineColor, Converter={StaticResource color2RectangleConverter}, UpdateSourceTrigger=PropertyChanged}" HeaderStyle="{StaticResource dgHeader}" Width="*"> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid>colorBrushes如下:
<ObjectDataProvider MethodName="GetType" ObjectType="{x:Type sys:Type}" x:Key="colorsTypeOdp"> <ObjectDataProvider.MethodParameters> <sys:String>System.Windows.Media.Colors, PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</sys:String> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> <ObjectDataProvider ObjectType="{x:Type local:GetBrushes}" MethodName="GetRectangles" x:Key="colorBrushes"> <ObjectDataProvider.MethodParameters> <ObjectDataProvider ObjectInstance="{StaticResource colorsTypeOdp}" MethodName="GetProperties"> </ObjectDataProvider> </ObjectDataProvider.MethodParameters> </ObjectDataProvider>
绑定的效果如下:
存在的问题就是:curveName列和lineThickness是可以正确绑定的。(curveName和lineThickness是DataGrid的另外两列,我上边的代码没有复制上去。)lineColor列是根据ObjectDataProvider 提供的Rectangle显示颜色选择器。它的选项也可以填充各种颜色,但是在加载时lineColor列不显示相应的颜色,选中时再点击空白的地方也会消失。
通过使用VS2015中的Live Visual Tree工具观察发现DataGridComboBoxColumn 的非编辑状态的DataGridCell内容是TextBlock类,与想要的Rectangle不符。所以转换思路使用DataGridTemplateColumn。
下面是正确的情况:
<DataGridTemplateColumn Header="{DynamicResource lineColor}" HeaderStyle="{StaticResource dgHeader}" Width="*" CellTemplate="{StaticResource DateTemplate}" CellEditingTemplate="{StaticResource EditingDateTemplate}"> </DataGridTemplateColumn>
其中的DataTemplate和EditingDataTemplate是这样的:
<!--显示模板--> <DataTemplate x:Key="DateTemplate" > <StackPanel> <Border> <Rectangle Fill="{Binding LineColor, Converter={StaticResource color2BrushConverter}}" Width="60" Height="20"></Rectangle> </Border> </StackPanel> </DataTemplate> <!--编辑模板--> <DataTemplate x:Key="EditingDateTemplate"> <ComboBox ItemsSource="{Binding Source={StaticResource colorBrushes}}" SelectedItem="{Binding LineColor, Converter={StaticResource color2RectangleConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > </ComboBox> </DataTemplate>
colorBrushes请看错误的情况。
其中color2BrushConverter如下:
public class Color2BrushConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Color? color = value as Color?; if (color.HasValue) { return new SolidColorBrush(color.Value); } else { return null; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
color2RectangleConverter如下:
public class Color2RectangleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Color? color = value as Color?; if (color.HasValue) { Rectangle newRect = new Rectangle(); newRect.Fill = new SolidColorBrush(color.Value); newRect.Height = 20; newRect.Width = 60; newRect.Margin = new Thickness(0); return newRect; } else { return null; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { Rectangle rect = value as Rectangle; Brush brush = rect.Fill; Color color = (Color)ColorConverter.ConvertFromString(brush.ToString()); return color; } }
效果如下:
问题出在Rectangle的Fill绑定的是System.Windows.Media.Color类,这是不行的,必须是Brush类。思路来自
https://stackoverflow.com/questions/5474828/adding-a-small-coloured-rectangle-in-datagrid-cell/5474889#5474889
点击打开链接
相关文章推荐
- Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
- [WPF]DataGridTemplateColumn使用ComboBox绑定Dictionary细节记录
- Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
- SL - DataGrid - DataGridTemplateColumn的使用
- FLEX4实践—DatagridColumn根据条件显示不同颜色
- 关于使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能
- [原] Silverlight 3 DataGrid中定义列(DataGridTemplateColumn)
- eBook 功能模块一之颜色选择器【ColorPickerPreference】自定义Preference 对话框
- eBook 功能模块一之颜色选择器【ColorPickerPreference】自定义Preference 对话框
- ActionMainMenuBar使用XPColorMap定义颜色
- VC颜色列表的对话框的使用_CColorDialog(转)
- 颜色对话框CColorDialog,字体对话框CFontDialog使用实例
- DataGrid的EditCommandColumn如何使用图片作为按钮
- DataGrid的EditCommandColumn如何使用图片作为按钮
- 将使用DataGrid进行数据绑定,使用Javascript控制当选中其中的checkbox时,该行颜色改变
- Flex中(DataGrid--DataGridColumn)数据颜色多样化-类型替换
- (论坛答疑点滴)DataGrid的EditCommandColumn如何使用图片作为按钮?
- Asp.Net中DataGrid的模版列(TemplateColumn)内容控制简单方法
- Flex中如何通过selectionColor和selectionDisabledColor样式设置DataGrid的行选中与无效时颜色的例子
- Asp.Net中DataGrid的模版列(TemplateColumn)内容控制简单方法。