添加项目时更改DataGrid行样式

时间:2017-05-11 15:15:29

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

我尝试在向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)具有&#34; -2&#34;,&#34; -1&#34;,&#34; -0&#34;或&#34; 1&#34;对于每个kMS(i)作为String,并将分配给Item.Visibility

For Instance

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

我错过了什么?

1 个答案:

答案 0 :(得分:0)

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

我的猜测是你改变了错误的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