WPF:将datagridow对象传递到转换器
本文关键字:转换器 对象 datagridow WPF | 更新日期: 2023-09-27 18:27:21
在WPF中将对象传递到转换器时遇到问题。
我的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();
}
}
当运行我的prog标记行时,抛出错误,即我的CustomTask t对象为null。我做错了什么?
编辑:
正如Vadim Martynov建议我将转换器更改为:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
CustomTask t = (CustomTask)value;
...
}
现在它工作得很好!感谢
下一个代码对我来说很好:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="ToolTipService.ToolTip" Value="{Binding Path=., Converter={StaticResource converter}}" />
</Style>
</DataGrid.RowStyle>
我还注意到,在您的代码中只有一个具有null值的调用。接下来的调用(如果您的绑定没有失败)将没有空的CustomTask值(当您实际调用Tooltip时),并且将进行fork。然后添加if(t==null)返回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在没有数据和数据源的情况下,在页面渲染和调用工具提示时渲染整个模板。如果您通过我的第一个代码示例设置属性,则只有在绑定Data之后才可以呈现和调用转换器。
更新要在类似的情况下操作孤立列,您可以更改此列的样式或模板,而不是像int这样的RowStyle,示例如下:
<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>