Применить ValueConverter к столбцу DataGrid

Я написал класс преобразователя (реализующий IValueConverter), который преобразует код, поступающий из базы данных (например, «CTY»), в более удобное для пользователя описание (например, «Город»). Я хочу использовать преобразователь для одного столбца в моем 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, потому что, если я ввожу поле, которого не существует, он выдает ошибку. Теперь он просто ничего не делает


person Jelle Capenberghs    schedule 20.01.2012    source источник
comment
Можете ли вы показать немного кода, где создается сетка данных и назначаются данные.   -  person Adrian Fâciu    schedule 20.01.2012
comment
Я добавил часть своего кода. Кажется, я не могу найти, где данные назначаются сетке, так как они где-то во фреймворке, и я не реализовал эту часть, надеюсь, вы понимаете;)   -  person Jelle Capenberghs    schedule 20.01.2012
comment
Первое, что приходит мне в голову, это то, что, если возможно, вы могли бы остановить автогенерацию столбцов и добавить их в представление самостоятельно. Таким образом, вы можете добавлять конвертеры только в те столбцы, которые вам нужны.   -  person Adrian Fâciu    schedule 20.01.2012
comment
Да, но сетка довольно общая, поэтому здесь могут быть небольшие проблемы... Но если бы я управлял ею с помощью столбцов в XAML, как бы я применил преобразователь к столбцу? Я искал в Интернете, и в обычной сетке данных есть свойство Binding, к которому я мог бы его привязать, но у столбца Xceed этого свойства нет. Я также отредактировал свой код в вопросе (сначала я забыл xaml datagrid)   -  person Jelle Capenberghs    schedule 20.01.2012


Ответы (2)


Вы можете использовать DataGridCollectionViewSource с DataGridItemProperty. Этот объект имеет Converter, которое можно использовать для назначения созданного вами конвертера нужному столбцу.

Что-то типа:

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

Более подробный пример в exceed документация.

person Adrian Fâciu    schedule 20.01.2012
comment
Большое спасибо, это было именно то, что я искал, но у меня все еще есть небольшая проблема (см. обновленный ответ :)) - person Jelle Capenberghs; 20.01.2012
comment
Вы должны убедиться, что ItemsSource DataGrid привязан к DataGridCollectionViewSource и что свойство Name DataGridItemProperty в точности совпадает со свойством объекта, привязанным к этому столбцу. - person Adrian Fâciu; 20.01.2012
comment
Да, имя правильное, потому что, если я ввожу неправильное имя, оно выдает ошибку, но теперь оно просто ничего не делает... - person Jelle Capenberghs; 20.01.2012

Ниже приведен полный пример кода. Этот XAML применяет DateConverter к двум столбцам дат (DateDue и DatePaid) в сетке Xceed:

<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>
person SezMe    schedule 15.04.2018