【问题标题】:Apply ValueConverter on DataGrid Column在 DataGrid 列上应用 ValueConverter
【发布时间】:2012-01-20 09:02:50
【问题描述】:

我编写了一个转换器类(实现 IValueConverter),它将来自数据库的代码(例如“CTY”)转换为更用户友好的描述(例如“City”)。我想在 XCeed WPF Datagridcontrol 的单个列上使用转换器,但我不知道必须将转换器设置为哪个属性。我还尝试使用样式将其附加到 DataCell,但它无法正常工作,我认为这也没有必要,因为转换器应该只应用于一列而不是每个单元格。

这些列也是自动生成的,所以如果我可以在运行时应用它,那就太棒了!

我不知道我必须将转换器应用于列的哪个属性(Xceed 列没有“绑定”属性。你们有什么建议吗?

如果需要,可以提供更多示例或代码。我希望我的问题对你来说有点清楚。

编辑:

这是我在 XAML 文件中使用的内容:

     <utils:BudgettaireEntiteitConverter x:Key="BudgettaireEntiteitConverter" />

    <xcdg:DataGridCollectionViewSource x:Key="GridViewSourceDefault"
                                               Source="{Binding Converter={StaticResource BudgettaireEntiteitConverter}}">
                <xcdg:DataGridCollectionViewSource.DetailDescriptions>
                        <lc:ActieOverzichtBudgettenDescription  
                                                         RelationName="Budgetten"
                                                         AutoCreateDetailDescriptions="False" 
                                                         AutoCreateForeignKeyDescriptions="False"
                                                         AutoCreateItemProperties="True"
                                                         Title="Budgetten" >
                            <lc:ActieOverzichtBudgettenDescription.StatFunctions>
                                <xcdg:SumFunction ResultPropertyName="SumOfBedragInBudget"
                                              SourcePropertyName="BedragInBudget" />

                                <xcdg:SumFunction ResultPropertyName="SumOfBedragInAfwachting"
                                              SourcePropertyName="BedragInAfwachting" />
                            </lc:ActieOverzichtBudgettenDescription.StatFunctions>

                        <lc:ActieOverzichtBudgettenDescription.DetailDescriptions>
                                <lc:ActieBudgetRegistratieSleutelsDescription RelationName="RegistratieSleutels"
                                                                              AutoCreateDetailDescriptions="False"
                                                                              AutoCreateForeignKeyDescriptions="False"
                                                                              AutoCreateItemProperties="True"
                                                                              Title="Registratiesleutels" />
                </lc:ActieOverzichtBudgettenDescription.DetailDescriptions>

         </lc:ActieOverzichtBudgettenDescription>

   </xcdg:DataGridCollectionViewSource.DetailDescriptions>

</xcdg:DataGridCollectionViewSource>

 <xcdg:DataGridControl x:Name="lsvActies"
                              TargetUpdated="OnListTargetUpdated"
                              ItemsSourceName="Acties" 
                              IsRefreshCommandEnabled="False"
                              rf:XceedGridService.LoadUserSettings="True"
                              rf:XceedGridService.SettingsKeyName="ActieOverzichtGridKey"
                              rf:XceedGridService.ItemContextMenu="{StaticResource ActieContextMenu}">

                <xcdg:DataGridControl.CommandBindings>
                <CommandBinding Command="Delete" Executed="ExecuteDeleteItem" CanExecute="CanExecuteDeleteItem"/>
            </xcdg:DataGridControl.CommandBindings>

        </xcdg:DataGridControl>

这是我的转换器:

 Public Class BudgettaireEntiteitConverter
        Implements IValueConverter

        Private hs As Hashtable = FillHashTable()


        Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert

            If hs.ContainsKey(value)
                Return hs(value).ToString()
            Else
                Return Nothing
            End If

        End Function

        Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
            Throw New NotSupportedException("ConvertBack not supported!")
        End Function

        Function FillHashTable() As Hashtable
            Dim hashtable As New Hashtable
            Dim dataCache = New ReferentieDataCache

            Dim budgettaireEntiteiten = dataCache.GetBudgettaireEntiteiten()

            For Each budgettaireEntiteitRow As BudgettaireEntiteitRow In budgettaireEntiteiten
                hashtable.Add(budgettaireEntiteitRow.BudgettaireEntiteit, budgettaireEntiteitRow.DisplayOmschrijving)
            Next

            Return hashtable
        End Function

    End Class

EDIT2:

我尝试使用 DataGridItemProperty(请参阅下面的 XAML),但在调试时我没有进入 Converter 类,并且网格仅加载初始数据而不是转换后的数据。

 <xcdg:DataGridCollectionViewSource.ItemProperties>
        <xcdg:DataGridItemProperty Name="BudgettaireEntiteit" Converter="{StaticResource BudgettaireEntiteitConverter}" />
 </xcdg:DataGridCollectionViewSource.ItemProperties>

它肯定知道 BudgettaireEntiteit 字段,因为如果我输入一个不存在的字段,它会引发错误。现在它什么也不做

【问题讨论】:

  • 你能显示一些创建数据网格和分配数据的代码吗?
  • 我添加了一些代码。我似乎无法找到将数据分配给网格的位置,因为它位于框架中的某个位置并且我没有实现该部分,希望您能理解;)
  • 我首先想到的是,如果可能的话,您可以停止自动生成列并将它们自己添加到视图中。通过这种方式,您可以仅将转换器添加到您需要的列中。
  • 是的,但是网格非常通用,所以那里可能有点问题...但是如果我要使用 XAML 中的列来管理它,我将如何将转换器应用于列?我在互联网上搜索,在普通的数据网格上,有一个绑定属性,我可以在其中绑定它,但 Xceed 列没有该属性。我还在问题中编辑了我的代码(我首先忘记了 datagrid xaml)

标签: wpf vb.net xaml ivalueconverter xceed-datagrid


【解决方案1】:

您可以使用带有DataGridItemProperty 的DataGridCollectionViewSource。此对象有一个Converter 属性,可用于将您创建的转换器分配给所需的列。

类似:

 <xcdg:DataGridItemProperty Name="RequiredColumn"
       Converter="{StaticResource BudgettaireEntiteitConverter}"/>

exceed documentation中的更详细示例。

【讨论】:

  • 非常感谢,这正是我一直在寻找的,但我仍然有一个小问题(请参阅更新的答案:))
  • 您应该检查 DataGrid 的 ItemsSource 是否绑定到 DataGridCollectionViewSource,并且 DataGridItemProperty 的 Name 属性是否与绑定到该列的对象属性完全相同。
  • 是的,名称是正确的,因为如果我输入错误的名称会引发错误,但现在它什么也不做......
【解决方案2】:

下面是完整的示例代码。此 XAML 将 DateConverter 应用于 Xceed 网格中的两个日期列(DateDue 和 DatePaid):

<Window.Resources>
    <local:DateConverter x:Key="conDate" />
    <xcdg:DataGridCollectionViewSource
        AutoCreateItemProperties="False"
        Filter="Filter_By_Member"
        x:Key="cvsDonations">
        <xcdg:DataGridCollectionViewSource.ItemProperties>
            <xcdg:DataGridItemProperty
                Name="DateDue"
                Converter="{StaticResource conDate}">
            </xcdg:DataGridItemProperty>
            <xcdg:DataGridItemProperty
                Name="DatePaid"
                Converter="{StaticResource conDate}">
            </xcdg:DataGridItemProperty>
        </xcdg:DataGridCollectionViewSource.ItemProperties>
    (</xcdg:DataGridCollectionViewSource>

.....

</Window.Resources>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2015-11-26
    • 2013-08-12
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多