2014-01-20 4 views
0

В столбце с автогенерированным столбцом данных я хочу заменить определенное значение (-1) пустым.Почему IValueConverter не вызван для автогенерации DataGrid Столбец

Я создал IValueConverter:

<ValueConversion(GetType(DataRowView), GetType(String))> 
Public Class UsageConversion 
    Implements IValueConverter 

    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 
     Dim model As ProgModel = DirectCast(value, ProgModel) 
     If model.Usage = -1 Then 
      Return "" 
     Else 
      Return model.Usage.ToString 
     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 
     Return Nothing 
    End Function 
End Class 

и обвили его в метод OnAutoGeneratingColumn:

 Dim dgtc As DataGridTextColumn = TryCast(e.Column, DataGridTextColumn) 
     If dgtc IsNot Nothing Then 
       Dim UsageBinding = New Binding() 
       UsageBinding.Converter = New UsageConversion 
       Dim tbStyle As New Style 
       tbStyle.TargetType = GetType(TextBlock) 
       tbStyle.Setters.Add(New Setter(TextBlock.TextProperty, UsageBinding)) 
       dgtc.ElementStyle = tbStyle 
     End If 

OnAutoGeneratingColumn работает хорошо, но код Преобразовать не запускается - установка точки останова в нем показывает он никогда не называется.

Любые идеи, почему?

Я использую .Net 4.0

Спасибо!

+0

Удалена ли точка останова в обработчике 'OnAutoGeneratingColumn'? – Sheridan

+0

Да, точка останова показывает, что код, который я отправил из OnAutoGeneratingColumn, запускается, и что dgtc.ElementStyle сеттеры включают в себя сеттер с Property = Text – GilShalit

+0

Вы пытались установить 'UsageBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;'? Может быть, это * работает *, но просто не * когда * ожидается? – Sheridan

ответ

0

Я думаю, вы должны установить UsageBinding.Path свойству

Binding.Path свойство не установлено, так что вы колонок это переплетено ничего , и поэтому значения не приходит к преобразователю

попробовать этот

Dim UsageBinding = New Binding(e.PropertyName) 
UsageBinding.Converter = New UsageConversion 
dgtc.Binding=UsageBinding 
+0

Спасибо. Это не имело никакого значения. – GilShalit

+1

Я думаю, вам не нужен стиль. Просто привяжите свой столбец к данным через конвертер. – potehin143

+0

. Мое замечание об этом не повлияло на предположение перед редактированием. Как сейчас, это правильный ответ - спасибо! – GilShalit

2

Я не уверен, почему вы пытаетесь установить этот Binding на ElementStyle ... конечно же, вы просто хотите, чтобы установить, что Binding на весь столбец:

Dim dgtc As DataGridTextColumn = TryCast(e.Column, DataGridTextColumn) 
    If dgtc IsNot Nothing Then 
      Dim UsageBinding = New Binding() 
      UsageBinding.Converter = New UsageConversion 
      dgtc.Binding = UsageBinding 
+0

Ох ... просто избили. Если это решение, пожалуйста, подтвердите принятый ответ на @potehin143. – Sheridan

+0

Как @ potehin143 только отправил комментарий, я могу просто +1 его. Танки все равно - вы были правы на отметке. – GilShalit

+0

и BTW, нет необходимости в «YourPropertyName». Dim UsageBinding = New Binding() работает отлично. – GilShalit