可重用的数据网格模板列样式



我希望有一个带有以下行为的复选框列的数据网格:选中复选框时,复选框在单元格中居中,单元格背景为绿色。

目前,我使用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 对其进行调整。

希望对您有所帮助! :)

相关内容

  • 没有找到相关文章

最新更新