gpt4 book ai didi

c# - WPF:将 datagridrow 对象传递给转换器

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:12 25 4
gpt4 key购买 nike

我在将对象传递给 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 对象为空。我做错了什么?

编辑:

根据 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>

我还注意到您的代码中只有一个调用具有空值。下一次调用(如果您的绑定(bind)没有失败)将不会有空 CustomTask 值(当您实际调用工具提示时)并且会很好地 fork 。然后只需添加 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 在没有数据和数据源的情况下在页面呈现和调用工具提示上呈现其整个模板。如果您通过我的第一个代码示例设置属性,则只有在绑定(bind)数据后才会进行渲染和转换器调用。

更新要在类似情况下操作隔离列,您可以更改此列的样式或模板而不是 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>

关于c# - WPF:将 datagridrow 对象传递给转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com