在代码隐藏中定义和使用样式
defining and using styles in code behind
我从 telerik:RadGridView 创建了一个派生的 class。
我需要根据数据对单元格进行样式设置。
这样我就创建了一个样式 class 并将其用作列的 cellstyleselector。
我需要为每一列设置列单元格样式,我使用了下面的代码,但它不起作用。你知道为什么它不起作用吗?
public WPFGridConv()
{
this.ShowGroupPanel = false;
this.Loaded += WPFGridConv_Loaded;
this.AutoGeneratingColumn += WPFGridConv_AutoGeneratingColumn;
this.ValidationType = GridViewValidationType.None;
this.ValidatesOnDataErrors= GridViewValidationMode.InViewMode;
}
private void WPFGridConv_AutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e)
{
CreateHeader();
}
public void WPFGridConv_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
CreateHeader();
}
private void CreateHeader()
{
foreach (Telerik.Windows.Controls.GridViewColumn column in this.Columns)
{
column.CellStyleSelector= new GridStyleSelector();
}
}
public class GridStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
if (container is GridViewCell)
{
GridViewCell cell = container as GridViewCell;
string columnId = cell.Column.Tag.ToString();
WPFGridConv grid = cell.ParentOfType<WPFGridConv>();
List<InputClass.GridColumnInfoClass> columnsInfoList = grid.workingGridClass.ListOfColumnsInfo;
InputClass.GridColumnInfoClass columnInfo = columnsInfoList.Find(x => x.id == columnId);
Type columnType = columnInfo.typeOfColumn;
if ((cell.Value==null||string.IsNullOrEmpty(cell.Value.ToString())) && columnInfo.IsValueNecessary)
{
return NeedeValueStyle;
}
else
{
if (columnType == null || columnType == typeof(double))
{
double dummyDbl;
if (!double.TryParse(cell.Value.ToString(), out dummyDbl))
return BadInputStyle;
else
return CorrectValueStyle;
}
else if (columnType == typeof(int))
{
int dummyInt;
if (!int.TryParse(cell.Value.ToString(), out dummyInt))
return BadInputStyle;
else
return CorrectValueStyle;
}
return CorrectValueStyle;
}
}
return null;
}
public Style OutOfRangeStyle
{
get
{
Style returnStyle=new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Purple)));
return returnStyle;
}
set
{
}
}
public Style BadInputStyle {
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Red)));
return returnStyle;
}
set
{
}
}
public Style NeedeValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.IndianRed)));
return returnStyle;
}
set
{
}
}
public Style CorrectValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Black)));
return returnStyle;
}
set
{
}
}
}
如果您使用隐式主题,那么您的样式将不起作用,因为它们不是基于现有样式。
您应该删除您在 getter 中创建的样式,而是将它们作为 xaml 资源添加到您的 app/page/control.
例如改
public Style CorrectValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Black)));
return returnStyle;
}
set
{
}
}
到
public Style CorrectValueStyle { get; set; }
然后在您的 xaml 中定义样式选择器,如下所示:
<Grid.Resources>
<my:GridStyleSelector x:Key="styleSelector">
<my:GridStyleSelector.CorrectValueStyle>
<Style TargetType="telerik:GridViewCell">
<Setter Property="BorderBrush" Value="Black"/>
</Style>
</my:GridStyleSelector.CorrectValueStyle>
...etc...
</my:GridStyleSelector>
</Grid.Resources>
如果您使用隐式主题,则需要为每种样式设置 BasedOn 属性:
<Style TargetType="telerik:GridViewCell" BasedOn="{StaticResource GridViewCellStyle">
然后您可以像这样在列上使用样式选择器:
<telerik:RadGridView>
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeProperty}"
CellStyleSelector="{StaticResource styleSelector}" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
大家好,感谢您的回复。 telerik 支持人员如下回答我,经我检查,这是真的。
Hello,
The styles you defined are correctly defined and are indeed applied, however, because of RadGridView's gridlines, the BorderThickness and BorderBrush properties of the cell are not respected. You can test this by setting the Background or Foreground properties instead to see if the styles are applied.
Thus, you will need to edit the control template of the element in order to achieve the desired result. Here's a forum thread discussing a similar scenario.
I hope you find this helpful.
Regards,
Dilyan Traykov
Telerik by Progress
我从 telerik:RadGridView 创建了一个派生的 class。 我需要根据数据对单元格进行样式设置。 这样我就创建了一个样式 class 并将其用作列的 cellstyleselector。 我需要为每一列设置列单元格样式,我使用了下面的代码,但它不起作用。你知道为什么它不起作用吗?
public WPFGridConv()
{
this.ShowGroupPanel = false;
this.Loaded += WPFGridConv_Loaded;
this.AutoGeneratingColumn += WPFGridConv_AutoGeneratingColumn;
this.ValidationType = GridViewValidationType.None;
this.ValidatesOnDataErrors= GridViewValidationMode.InViewMode;
}
private void WPFGridConv_AutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e)
{
CreateHeader();
}
public void WPFGridConv_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
CreateHeader();
}
private void CreateHeader()
{
foreach (Telerik.Windows.Controls.GridViewColumn column in this.Columns)
{
column.CellStyleSelector= new GridStyleSelector();
}
}
public class GridStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
if (container is GridViewCell)
{
GridViewCell cell = container as GridViewCell;
string columnId = cell.Column.Tag.ToString();
WPFGridConv grid = cell.ParentOfType<WPFGridConv>();
List<InputClass.GridColumnInfoClass> columnsInfoList = grid.workingGridClass.ListOfColumnsInfo;
InputClass.GridColumnInfoClass columnInfo = columnsInfoList.Find(x => x.id == columnId);
Type columnType = columnInfo.typeOfColumn;
if ((cell.Value==null||string.IsNullOrEmpty(cell.Value.ToString())) && columnInfo.IsValueNecessary)
{
return NeedeValueStyle;
}
else
{
if (columnType == null || columnType == typeof(double))
{
double dummyDbl;
if (!double.TryParse(cell.Value.ToString(), out dummyDbl))
return BadInputStyle;
else
return CorrectValueStyle;
}
else if (columnType == typeof(int))
{
int dummyInt;
if (!int.TryParse(cell.Value.ToString(), out dummyInt))
return BadInputStyle;
else
return CorrectValueStyle;
}
return CorrectValueStyle;
}
}
return null;
}
public Style OutOfRangeStyle
{
get
{
Style returnStyle=new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Purple)));
return returnStyle;
}
set
{
}
}
public Style BadInputStyle {
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Red)));
return returnStyle;
}
set
{
}
}
public Style NeedeValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.IndianRed)));
return returnStyle;
}
set
{
}
}
public Style CorrectValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Black)));
return returnStyle;
}
set
{
}
}
}
如果您使用隐式主题,那么您的样式将不起作用,因为它们不是基于现有样式。
您应该删除您在 getter 中创建的样式,而是将它们作为 xaml 资源添加到您的 app/page/control.
例如改
public Style CorrectValueStyle
{
get
{
Style returnStyle = new Style(typeof(GridViewCell));
returnStyle.Setters.Add(new Setter(GridViewCell.BorderBrushProperty, new SolidColorBrush(Colors.Black)));
return returnStyle;
}
set
{
}
}
到
public Style CorrectValueStyle { get; set; }
然后在您的 xaml 中定义样式选择器,如下所示:
<Grid.Resources>
<my:GridStyleSelector x:Key="styleSelector">
<my:GridStyleSelector.CorrectValueStyle>
<Style TargetType="telerik:GridViewCell">
<Setter Property="BorderBrush" Value="Black"/>
</Style>
</my:GridStyleSelector.CorrectValueStyle>
...etc...
</my:GridStyleSelector>
</Grid.Resources>
如果您使用隐式主题,则需要为每种样式设置 BasedOn 属性:
<Style TargetType="telerik:GridViewCell" BasedOn="{StaticResource GridViewCellStyle">
然后您可以像这样在列上使用样式选择器:
<telerik:RadGridView>
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding SomeProperty}"
CellStyleSelector="{StaticResource styleSelector}" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
大家好,感谢您的回复。 telerik 支持人员如下回答我,经我检查,这是真的。
Hello, The styles you defined are correctly defined and are indeed applied, however, because of RadGridView's gridlines, the BorderThickness and BorderBrush properties of the cell are not respected. You can test this by setting the Background or Foreground properties instead to see if the styles are applied. Thus, you will need to edit the control template of the element in order to achieve the desired result. Here's a forum thread discussing a similar scenario. I hope you find this helpful. Regards, Dilyan Traykov Telerik by Progress