【问题标题】:Alternative styles in code for DataGrid rows in WPFWPF 中 DataGrid 行的代码中的替代样式
【发布时间】:2021-01-24 19:20:15
【问题描述】:

我有一个 DataGrid 及其 RowStyle 在 XAML 中设置:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Style.Triggers>
            <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                <Setter Property="Background" Value="LightSteelBlue"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Aquamarine"/>
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

DataGrid 包含我希望在选择该行时打印的行详细信息。但是,我需要在打印时将行的背景颜色(包括其行详细信息)从 Aquamarine 更改为 White,然后在打印后再次返回。我有以下方法来实现这一点:

private void ChangeStyle(bool printing)
{
    Style rsRowStyle = new Style();
    Style oldStyle = dgdCustomersListing.RowStyle;
    Trigger DataTrigger = new Trigger();
    DataTrigger.Property = DataGridRow.IsSelectedProperty;
    DataTrigger.Value = true;
    rsRowStyle.Triggers.Add(DataTrigger);
    Setter TriggerSetter = new Setter();
    TriggerSetter.Property = DataGridRow.BackgroundProperty;
    TriggerSetter.Value = Brushes.LightGray;
    rsRowStyle.Setters.Add(TriggerSetter);
    dgdCustomersListing.RowStyle = printing ? rsRowStyle : oldStyle;
}

第一次调用打印时效果很好(行背景转换为白色),但是当printingfalse 时再次调用该方法无法将DataGrid 恢复为原始样式。

为什么它不起作用?

【问题讨论】:

  • 我认为您应该默认在触发器之外明确定义背景。

标签: c# wpf xaml datagrid


【解决方案1】:

我的错误:首先调用打印方法时需要对oldStyle 进行赋值,然后将该值传递给ChangeStyle 方法,以便该方法不会更改它。因此:

private void ChangeStyle(bool printing, Style oldStyle)
{
    Style rsRowStyle = new Style();
    Trigger DataTrigger = new Trigger();
    DataTrigger.Property = DataGridRow.IsSelectedProperty;
    DataTrigger.Value = true;
    rsRowStyle.Triggers.Add(DataTrigger);
    Setter TriggerSetter = new Setter();
    TriggerSetter.Property = DataGridRow.BackgroundProperty;
    TriggerSetter.Value = Brushes.LightGray;
    rsRowStyle.Setters.Add(TriggerSetter);
    dgdCustomersListing.RowStyle = printing ? rsRowStyle : oldStyle;
}

我把它作为问答留了下来,因为我花了一些时间来整理如何更改代码中的样式,我希望这对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2011-05-31
    • 2013-03-10
    相关资源
    最近更新 更多