我希望有一个带有复选框列的数据网格,其行为如下:复选框位于单元格的中心,选中复选框时单元格背景为绿色。
目前,我使用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>
答案 0 :(得分:0)
您可以在DataTemplates
:
Window
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);
}
答案 1 :(得分:0)
您可以尝试在复选框的Checked Visual状态中进行更改,而不是使用触发器。我已经为Windows Phone 8.1 here回答了这个问题。相应地适应wpf。
希望它有所帮助! :)