【问题标题】:Avalonia UI C# XAML WPF - Adjust data grid row color based on column valueAvalonia UI C# XAML WPF - 根据列值调整数据网格行颜色
【发布时间】:2020-05-04 09:34:46
【问题描述】:
public class EventLogView : UserControl
{
    private DataGrid dataGrid;
    public EventLogView()
    {
        this.InitializeComponent();
        dataGrid = this.FindControl<DataGrid>("EventLogsDataGrid");
        this.dataGrid.LoadingRow += new EventHandler<DataGridRowEventArgs>(dataGrid_LoadingRows);
    } 

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);
    }

    void dataGrid_LoadingRows(object sender, DataGridRowEventArgs e)
    {

    }
}

如果第 4 列的值为“HIGH”,我想将每一行的颜色更改为红色。

【问题讨论】:

  • 在代码隐藏中我可以访问这个特定的 DataGrid 对象,我可以将每一行更改为红色,但我无权访问列的值

标签: c# wpf xaml datagrid avalonia


【解决方案1】:

在“纯”WPF 中执行此操作的方法是使用 DataTrigger 定义 ItemContainerStyle

<DataGrid x:Name="EventLogsDataGrid"
                  AutoGenerateColumns="False"
                  Items="{Binding LogsData}"
                  CanUserReorderColumns="True"
                  CanUserResizeColumns="True"
                  IsReadOnly="True">
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Importance}" Value="HIGH">
                    <Setter Property="Background" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.ItemContainerStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Id}"
                                Header="ID"
                                Width="Auto"/>
        <DataGridTextColumn Binding="{Binding Content}"
                                Header="Content"
                                Width="Auto"/>
        <DataGridTextColumn Binding="{Binding CreationDate}"
                                Header="Date Time"
                                Width="Auto"/>
        <DataGridTextColumn Binding="{Binding Source}"
                                Header="Source"
                                Width="Auto"/>
        <DataGridTextColumn Binding="{Binding Importance}"
                                Header="Priority"
                                Width="Auto"/>
    </DataGrid.Columns>
</DataGrid>

但由于 Avalonia 不支持触​​发器,您可能必须像这样处理 LoadingRow 事件以编程方式设置 Background 属性:

void dataGrid_LoadingRows(object sender, DataGridRowEventArgs e)
{
    var dataObject = e.Row.DataContext as YourDataObject;
    if (dataObject != null && dataObject.Importance == "HIGH")
        e.Row.Background = Brushes.Red;
}

【讨论】:

  • 这给了我:Unable to resolve type DataTrigger from namespace github.com/avaloniaui
  • @Matheew:将DataTrigger 替换为DataTriggerBehavior,如图所示here
  • 我不知道为什么,但它也不起作用,它会产生同样的错误,我已经阅读了你上面链接的文章。
  • 非常感谢您帮助我解决了这个问题!非常感谢!
猜你喜欢
  • 2018-02-02
  • 2019-01-28
  • 1970-01-01
  • 2012-04-20
  • 2023-01-19
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多