2015-12-18 4 views
1

У меня проблема с передачей объекта в конвертер в WPF.WPF: передача объекта datagridrow в конвертер

Моя DataGrid выглядит следующим образом:

<DataGrid x:Name="customTasksDataGrid" Margin="10,10,10,38" Grid.Column="1" IsReadOnly="True" AutoGenerateColumns="False"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="ToolTip"> 
       <Setter.Value> 
        <TextBlock Text="{Binding Path=., Converter={StaticResource converter}, NotifyOnTargetUpdated=True}"/> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.RowStyle> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
     <DataGridTextColumn Header="Klient" Binding="{Binding Client.Names}"/> 
     ... 
    </DataGrid.Columns> 
</DataGrid> 

Преобразователь:

public class DateToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     CustomTask t = (CustomTask)value; 
     Console.WriteLine(t.ToString()); // HERE 
     ... 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

При запуске мой прог отмеченной линии бросает ошибку, что мой CustomTask т объект является нулевым. Что я делаю не так?

EDIT:

Как Вадим Мартынов предложил мне поменять нейтрализатор:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) 
     return null; 
    CustomTask t = (CustomTask)value; 
    ... 
} 

И это прекрасно работает сейчас Благодаря

+0

Что произойдет, если вы берете вызов к преобразователю , т.е. заменить на: отображается ли имя клиента во всплывающей подсказке? – Stew52

+0

@ Stew52 нет в этом случае конвертер никогда не звонит –

+0

он не будет делать, потому что вы его удалили. но показывает ли это, что вы ожидаете? т.е. есть ли контекст данных для подсказки, что вы ожидаете от нее? – Stew52

ответ

3

Следующий код отлично работает для меня:

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="ToolTipService.ToolTip" Value="{Binding Path=., Converter={StaticResource converter}}" /> 
    </Style> 
</DataGrid.RowStyle> 

Кроме того, я заметил, что есть только один вызов с нулевым значением в вашем коде. Следующие вызовы (если ваша привязка не сработает) не будут иметь значение null CustomTask (когда вы на самом деле вызываете подсказку) и будете отлично работать. Затем просто добавьте if (t == null) return null; к вашему конвертеру, и все будет нормально работать.

public class DateToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    CustomTask t = (CustomTask)value; 
    if(t == null) 
     return null; // or other default value 
    ... 
} 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Я думаю, что это причина такого поведения является то, что DataGrid оказывает весь его шаблоны на странице рендеринга и вызвать всплывающую подсказку без данных и источника данных. Если вы установите свойство через мой первый пример кода, то ничего не делать, а конвертировать вызовы можно только после привязки данных.

UPDATE Манипулировать изолированную колонку в подобном случае вы можете изменить стиль или шаблон этого столбца вместо RowStyle как INT на примере ниже:

<DataGrid x:Name="customTasksDataGrid" ItemsSource="..." IsReadOnly="True" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
     <DataGridTextColumn Header="Klient" Binding="{Binding Name}"> 
      <DataGridTextColumn.ElementStyle> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="ToolTipService.ToolTip"> 
         <Setter.Value> 
          <TextBlock Text="{Binding Path=., Converter={StaticResource converter}}"/> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Спасибо, чувак, этот код работает для меня, но я получил вопрос со следующим шагом. Изменение цвета фона всей строки отлично работает, но как изменить фон только одной ячейки в моем datagrid, используя эти функции? Конечно, я изменил 'ToolTipService.ToolTip' на' Background' –

+0

@MarcinZdunek [этот вопрос] (http://stackoverflow.com/questions/5549617/change-datagrid-cell-colour-based-on-values) помогает вам ? Просто измените DataGridTextColumn.ElementStyle вместо стиля строки. –

+0

, но мне нужно изменить цвет ячеек с информацией об объекте, хранящемся в одной строке. Например, цвет ячейки основан на параметрах объекта 2 –

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

  • Нет связанных вопросов^_^