【问题标题】:WPF datagrid and row data bound event?WPF数据网格和行数据绑定事件?
【发布时间】:2015-05-30 12:10:03
【问题描述】:

我有一个 WPF 网格,其中 autogeneratedcolumn 设置为 true。我必须为网格中的每一行修改给定单元格的模板。 WPF 数据网格中是否有一个事件可以让我捕获每一行并在渲染之前执行必要的修改?

如果没有,那么您能否建议在自动生成的数据网格中自定义行单元格的最佳方法是什么?

【问题讨论】:

  • 修改列是特定的吗?或者每一列的单元格修改可以改变吗?
  • 修改是特定于列的。假设如果一列符合给定的条件,那么我必须为该特定列更改网格中每一行的模板。
  • 在这种情况下,附加到 DataGrid.AutoGeneratingColumn 事件。您可以将 DataGridAutoGeneratingColumnEventArgs.Column 中的默认列替换为新列。例如,您可以将其替换为具有自定义 CellTemplate 和 CellEditingTemplate 的新 DataGridTemplateColumn。
  • 或者使用 DataTemplateSelector 而不是搞乱事件并以 WPF 方式进行。

标签: c# wpf wpfdatagrid


【解决方案1】:

我建议使用DataTemplateSelector 而不是搞乱事件。这将允许您以编程方式根据单元格中的数据干净地改变单元格模板。 WPF 中的挂钩事件不可避免地会导致引用的持有时间比您预期的要长,这表现为内存泄漏。

MSDN 文档可用here

来自 MSDN 的代码:

Namespace SDKSample
    Public Class TaskListDataTemplateSelector
        Inherits DataTemplateSelector
        Public Overrides Function SelectTemplate(ByVal item As Object, ByVal container As DependencyObject) As DataTemplate

            Dim element As FrameworkElement
            element = TryCast(container, FrameworkElement)

            If element IsNot Nothing AndAlso item IsNot Nothing AndAlso TypeOf item Is Task Then

                Dim taskitem As Task = TryCast(item, Task)

                If taskitem.Priority = 1 Then
                    Return TryCast(element.FindResource("importantTaskTemplate"), DataTemplate)
                Else
                    Return TryCast(element.FindResource("myTaskTemplate"), DataTemplate)
                End If
            End If

            Return Nothing
        End Function
    End Class
End Namespace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多