可重用的DataGridTemplateColumn样式

时间:2016-02-16 10:34:06

标签: wpf xaml checkbox styles datagridtemplatecolumn

我希望有一个带有复选框列的数据网格,其行为如下:复选框位于单元格的中心,选中复选框时单元格背景为绿色。

目前,我使用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>

2 个答案:

答案 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。

希望它有所帮助! :)