ComponentOne的FlexGrid背景颜色

时间:2012-08-07 19:03:18

标签: wpf caliburn.micro componentone

我有一个WPF Caliburn.Micro应用程序。我以前有一个DataGrid,这是代码的一部分:

<DataGrid x:Name="FirstEntries" Grid.Row="5"
      AutoGenerateColumns="False"
      BaseControls:DataGridExtension.Columns="{Binding FirstEntryGridColumns}"
      CanUserAddRows="False" IsReadOnly="True"
      SelectedItem="{Binding Path=SelectedFirstEntry}">
  <DataGrid.Resources>
      <conv:StatusToBackgroundColorConverter x:Key="StatusToBackgroundColor"/>
  </DataGrid.Resources>
  <DataGrid.ItemContainerStyle>
      <Style TargetType="{x:Type DataGridRow}">
          <Style.Setters>
              <Setter Property="Background" Value="{Binding Path=Status, Converter={StaticResource StatusToBackgroundColor}}"></Setter>
              <Setter Property="cal:Message.Attach" Value="[Event MouseDoubleClick] = [Action OnDoubleClickFirstEntry($dataContext)]"/>
          </Style.Setters>
      </Style>
  </DataGrid.ItemContainerStyle>

您可以看到每行的背景颜色都绑定到“状态”字段值,并且会处理双击事件。现在我正在迁移到ComponentOne的FlexGrid,我不知道如何在那里实现相同,因为FlexGrid似乎不知道ItemContainerStyle。

你可以帮我解决这个问题吗? 感谢。

2 个答案:

答案 0 :(得分:1)

由于性能原因,C1 FlexGrid做了一些“WinFormsy”并且没有使用DependencyProperties或样式/模板,所以你不能使用数据触发器设置行背景或将命令设置为你想要的事件。他们的建议是使用Cell的鼠标点击事件在代码中处理所有事件。

我的建议是,如果可能的话,回到WPF 4.0的DataGrid并绑定to an ICollectionView to utilize it's Filtering function。链接是许多Bea Stollnitz关于操纵集合视图的教程。

答案 1 :(得分:1)

您是否看过 CellFactory 类和 ICellFactory 界面。 我用它根据我的一个项目中的项目状态设置不同的背景颜色。

Public Overrides Sub CreateCellContent(grid As C1.WPF.FlexGrid.C1FlexGrid, bdr As Border, rng As C1.WPF.FlexGrid.CellRange)
        MyBase.CreateCellContent(grid, bdr, rng)

        Dim infPre As InfPresenterTextEntity
        infPre = CType(grid.Rows(rng.Row).DataItem, InfPresenterTextEntity)

        If Not infPre Is Nothing Then
            If infPre.IsNew Then
                grid.Rows(rng.Row).Background = Brushes.LightGreen
            ElseIf infPre.IsDirty Then
                grid.Rows(rng.Row).Background = Brushes.LightYellow
            End If

            'grid.AutoSizeRow(rng.Row, 0)
            'grid.AutoSizeRows(rng.Row, rng.Row, 0)
        End if 
End Sub