2012-01-20 6 views
1

Я написал класс конвертера (реализующий IValueConverter), который преобразует код, который поступает из базы данных (например, «CTY») в более удобное для пользователя описание (например, «Город»). Я хочу использовать конвертер на одном столбце в моем XCeed WPF Datagridcontrol, но я не знаю, к какому свойству я должен установить конвертер. Я также попытался прикрепить его к DataCell с использованием стиля, но он не будет работать должным образом, и я думаю, что это также не обязательно, поскольку конвертер должен применяться только к одному столбцу, а не к каждой ячейке.Применить ValueConverter в столбце DataGrid

Столбцы также автогенерируются, поэтому, если бы я мог применить их во время выполнения, это было бы потрясающе!

Я не знаю, какое свойство колонки я должен aplly конвертер к (Колонный Xceed doens't имеют свойство «Binding». Есть ли у вас, ребята, есть какие-то предложения?

Больше примеров или кода . могут быть предоставлены, если просили, я надеюсь, что моя проблема немного ясно для вас

EDIT:.

Это те вещи, которые я использую в моем 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 ниже), но когда я отладки не входить в класс конвертер и сетки просто загружает с исходными данными, а не с преобразованными данными.

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

Это, безусловно, знает, поле BudgettaireEntiteit, потому что если я ввожу в поле, которое не существует, он выдает ошибку. Теперь он просто ничего не делает

+0

Можете ли вы показать немного кода, в котором создается датадайд и данные назначены. –

+0

Я добавил несколько кода. Я не могу найти, где данные привязаны к сетке, так как это где-то в рамках, и я не реализовал эту часть, надеюсь, что вы поймете;) –

+0

Первое, что приходит мне на ум, это то, что, если возможно, вы можете остановить автоматическое создание столбцов и добавить их в представление. Таким образом, вы можете добавлять конвертеры только в нужные столбцы. –

ответ

4

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

Что-то вроде:

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

Более подробный пример в exceed documentation.

+0

Большое спасибо, это было то, что я искал, но у меня все еще есть небольшая проблема (см. Обновленный ответ :)) –

+0

Вы должны проверить, что Элемент ItemsSource DataGrid привязан к DataGridCollectionViewSource и что свойство Name DataGridItemProperty точно совпадает с свойством объекта, которое ограничено этим столбцом. –

+0

Да, это имя правильно, потому что, если я ввожу неправильное имя, он выдает ошибку, но теперь он просто ничего не делает ... –

Смежные вопросы