我希望有一个带有以下行为的复选框列的数据网格:选中复选框时,复选框在单元格中居中,单元格背景为绿色。
目前,我使用DataGridTemplateColumn的样式来实现这一点(见下文(。此样式工作正常,但是复选框绑定到的属性名称在样式中被引用了两次。所以我无法将样式应用于绑定到另一个对象/属性的另一个列/网格。
有没有办法创建一个可重用的解决方案(使用 DataGridCheckBoxColumn 或其他方式(,其中绑定属性可以传入?
我现在的 xaml 风格:
<Style x:Key="IsClipToCalendarCheckBoxCellStyle" TargetType="DataGridCell">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<CheckBox IsChecked="{Binding IsClipToCalendar, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsClipToCalendar}" Value="True">
<Setter Property="Background" Value="DeepSkyBlue" />
</DataTrigger>
</Style.Triggers>
</Style>
Window
的代码隐藏中动态创建DataTemplates
:
private string StringTemplate =
@"<DataTemplate>
<StackPanel>
<Label Content=""fooTemplate"" />
<TextBox Text=""{Binding Path=fooColumn}""/>
</StackPanel>
</DataTemplate>";
在AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"
您可以使用您的DataTemplate
:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataTemplate dt = null;
string dtString = StringTemplate.Replace("fooColumn", e.PropertyName);
dt = GetDataTemplateForDataGrid(dtString);
DataGridTemplateColumn c = new DataGridTemplateColumn()
{
CellTemplate = dt,
Header = e.Column.Header,
HeaderTemplate = e.Column.HeaderTemplate,
HeaderStringFormat = e.Column.HeaderStringFormat,
SortMemberPath = e.PropertyName
};
e.Column = c;
}
和获取DateTemplates
的方法:
private DataTemplate GetDataTemplateForDataGrid(string templateString)
{
ParserContext context = new ParserContext();
context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
return (DataTemplate)Parse(templateString, context);
}
以及解析非英语字母的方法,如果您使用非英语字母的绑定:
public static object Parse(string xamlText, ParserContext parserContext)
{
return System.Windows.Markup.XamlReader.Load((Stream)new MemoryStream(Encoding.UTF8.GetBytes(xamlText)), parserContext);
}
您可以尝试在复选框的"已选中视觉对象"状态中进行更改,而不是使用触发器。我已经在这里回答了Windows Phone 8.1的问题。相应地针对 wpf 对其进行调整。
希望对您有所帮助! :)