从 TextBlock 但不是从 DataSource 中删除 Environment.Newline

Remove Environment.Newline from TextBlock but not from DataSource

我正在创建一个 WPF 屏幕(使用 MVVM 模式),它在 TextBlock 中的 ListView 中显示日志条目,包括异常详细信息。

<GridViewColumn
    ListViewBehaviors:LayoutColumn.Width="1*"
    ListViewBehaviors:LayoutColumn.MinWidth="123"
    ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
    DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay}"
    Header="Exception Data"/>

由于记录数据的方式,异常字符串包括大量回车符 returns / 换行符。示例:

System.BigBadException: Stuff blew up -> Some file location 
  at SomeMethodCallAtTheTopLevel: line 1234
  at SomeMethodCallAtTheNextLevel: line 123
  at SomeMethodCallAtAnotherLevel: line 12
  at SomeMethodCallOnBottomLevel: line 1

有些异常可能非常大。在我的 ListView 中将条目显示为行时,这会成为一个问题。 Environment.Newline 字符强制每行显示为多行,而不是在一行上很好地显示每个条目,从而导致用户在查看行条目时滚动更多。

我意识到一个简单的解决方案是手动删除换行符:

foreach (LogEntry entry in allEntries)
{
  entry.ExceptionData = entry.ExceptionData.Replace(Environment.NewLine, ""); 
}

问题

我希望文本显示在 GridViewColumn 单元格中,就像所有 Newline 都已被删除一样。但是,我想在数据中保留这些换行符。用户可以右键单击单元格并将其值复制到剪贴板。粘贴到文件(例如记事本)时,我希望出现换行符以使格式更易于阅读。

有没有办法忽略 xaml 中的换行符或其他方法? 还是我想吃我的蛋糕也想吃?

如果我对你的问题的理解正确,你可以创建一个隐藏字段来保存原始数据并使用一个字段进行显示。或者使用完全不同的显示模型。在某处保存您的原始数据。

截取 right-click/copy 事件——如果您还没有创建自己的事件——并替换所需的原始数据。

我现在的解决方案与 K_Ram 的讨论一致。但是,我不想在我的 ViewModel 中再添加一个 属性。此外,我想要一个也适用于未来项目的通用解决方案。因此我创建了一个简化的转换器 class.

public class RemoveNewLineConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    var val = value as string ?? string.Empty;
    return val.Replace(Environment.NewLine, string.Empty);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException("Method not implemented");
  }
}

那么,在xaml中的用法就是:

xmlns:Converters="clr-namespace:MyWpfHelpers.Converters;assembly=MyWpfHelpers"

<UserControl.Resources>
    <ResourceDictionary>
        <Converters:RemoveNewLineConverter x:Key="NoNewline"/>
    </ResourceDictionary>
</UserControl.Resources>

<GridViewColumn
    ListViewBehaviors:LayoutColumn.Width="1*"
    ListViewBehaviors:LayoutColumn.MinWidth="123"
    ListViewBehaviors:LayoutColumn.IsHidden="{Binding ExceptionDataIsHidden}"
    DisplayMemberBinding="{Binding ExceptionData, Mode=OneWay, Converter={StaticResource NoNewline}}"
    Header="Exception Data"/>