【问题标题】:Changing DataGrid Row Styles while adding Items添加项目时更改 DataGrid 行样式
【发布时间】:2017-10-10 16:38:51
【问题描述】:

我正在尝试在向 DataGrid 添加项目时更改行样式。

<DataGrid x:Name="datagrid1" HorizontalAlignment="Stretch" Height="auto" Margin="10,64,0,0" 
          VerticalAlignment="Stretch" Width="auto" AutoGenerateColumns="False" DataContext="{Binding}" ItemsSource="{Binding}">
    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding UIvisibility}" Value="-2">
                    <Setter Property="Visibility" Value="Hidden"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding UIvisibility}" Value="-1">
                    <Setter Property="Background" Value="Blue"/>
                    <Setter Property="Foreground" Value="White"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding UIvisibility}" Value="-0">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="Foreground" Value="Green"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.ItemContainerStyle>
</DataGrid>

kMS(i).line(7) 对于每个 kMS(i) 作为字符串具有“-2”、“-1”、“-0”或“1”,并将分配给 Item.Visibility

举例

kMS(1).line(7)="-1"
kMS(4).line(7)="-0"
kMS(369).line(7)="1"
kMS(897).line(7)="-2"

代码如下

Dim c3 As DataGridTextColumn = New DataGridTextColumn
c3.Binding = New System.Windows.Data.Binding("UIvisibility")
c3.Visibility = 1
datagrid1.Columns.Add(c3)

Dim Additem(kMS.Length - 1) As Item
For i = 0 To kMS.Length - 1
    Additem(i) = New Item
    Additem(i).Callback = kMS(i).line(8)
    Additem(i).Keyboard = "No Assign"
    If kMS(i).line(3).Remove(0, 2) <> "FFFFFFFF" Then
        Additem(i).Keyboard = kMS(i).line(3).Remove(0, 2)
    End If

    Additem(i).UIvisibility = kMS(i).line(7)

    datagrid1.Items.Add(Additem(i))
Next

 

Public Class Item
        Public Property Callback As String
        Public Property Keyboard As String
        Public Property UIvisibility As String
End Class

效果不好,结果只会是具有透明背景和黑色前景的行。

Actutal image of the application

我错过了什么?

【问题讨论】:

  • 好的,我的问题来自于 Mahapps 不允许 内工作。我可以通过禁用 Mahapps 样式来更改特定的行颜色。我也可以通过引用 this Answer 启用 Mahapps 来做同样的事情

标签: wpf vb.net data-binding datagrid datatrigger


【解决方案1】:

如果您发布问题的屏幕截图会有所帮助。

我的猜测是您更改了错误的 WPF 控件的属性。对于更改背景,DataGridRow 仅适用于未被任何行覆盖的行部分。当 DataGrid 比所有列加起来更宽时,可能会发生这种情况。

对于列,DataGridCell,即 TextBox 被绘制在 DataGridRow 上。所以如果 DataGridRow 是透明的,而 TextBox 是白色的,你会看到一个白色的背景。

这种问题 WPF 通常会避免使用图形继承,这意味着当在容器中设置属性时,所有不为该属性编写自己的值的控件都将从容器中继承该值。

不幸的是,DataGrid 的行为完全不同。通常,如果您不依赖图形继承而是设置正确的控件样式,您的问题就会消失。

2 条建议

1) 不要使用触发器来改变样式。您可以使用绑定轻松做到这一点:

<datagrid.rowstyle>
  <style targettype="DataGridRow">
    <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self},
      Path=Item.Quantity, Converter={StaticResource QuantityToBackgroundConverter}}"/>
  </style>
</datagrid.rowstyle>

前台可以这样做:

<Setter Property="Foreground" 
  Value="{Binding 
    RelativeSource={RelativeSource Self}, 
    Path=Text, 
    Converter={StaticResource QuantityToForegroundConverter}}" /> 

2) 格式化 DataGrid 是一个令人头疼的问题。我花了几个星期试图理解它。阅读我的文章,我在其中提供了很多背景信息和许多示例,其中包括如何进行重要的格式化:

www.codeproject.com: Guide to WPF DataGrid formatting using bindings

【讨论】:

  • 我已将屏幕截图添加到 OP。列数取决于连接到 PC 的游戏控制设备的数量,因此有时它可能比 DataGrid 宽,但是,即使不是,它也会保持白色背景(如屏幕截图中所示)。我已引用此代码link 来更改每行颜色取决于“UIvisibility”属性。我还从 codeproject.com 下载了您的源代码,现在正在寻找解决方案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多