加载具有条件字符串格式的数据绑定的 XAML 失败

本文关键字:数据绑定 失败 XAML 格式 有条件 字符串 加载 | 更新日期: 2023-09-27 18:32:29

我正在使用XamlReader加载 XAML,当我使用条件字符串格式进行数据绑定时,加载它时遇到问题。为了确保我没有犯任何语法错误,我在独立的 WPF 应用程序中尝试了条件格式。这是我用于验证的 XAML:

<Window
  x:Class="WpfApplication.Window"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <TextBlock Text="{Binding Value, StringFormat={}{0:;#,##0.00;}}"/>
</Window>

和代码隐藏:

public partial class Window {
  public Window() {
    InitializeComponent();
    DataContext = this;
  }
  public Decimal Value { get { return -1234567.89M; } }
}

正如预期的那样,数值显示时不带负号(如果值为零或正数,则不显示(。

但是,我想使用以下XamlReader加载 XAML:

var xaml = @"<TextBlock
  xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
  Text=""{Binding Value, StringFormat={}{0:;#,##0.00;}}""/>";
var textBlock = (TextBlock) XamlReader.Parse(xaml);

TextBlock是相同的,但是,对XamlReader.Parse的调用失败,并出现异常:

System.Windows.Markup.XamlParseException 发生  消息='标记扩展结束后出现意外令牌。行号"3"和行位置"40"。  源=表示框架  行号=3  线位置=40  堆栈跟踪:       at System.Windows.Markup.XamlReader.RewrapException(Exception e, Uri baseUri(       at System.Windows.Markup.XamlReader.Load(XmlReader reader, ParserContext parserContext, XamlParseMode parseMode(       at System.Windows.Markup.XamlReader.Load(XmlReader reader(       at System.Windows.Markup.XamlReader.Parse(String xamlText(       at wpfApplication.Window..ctor(( in WpfApplication''Window.xaml.cs:line 17  InnerException: System.Xaml.XamlParseException       消息='标记扩展结束后出现意外令牌。行号"3"和行位置"40"。       源=系统.Xaml       行号=3       线位置=40       堆栈跟踪:            在MS。Internal.Xaml.Parser.MePullParser.d__0.移动下一个((            在MS。Internal.Xaml.Parser.XamlPullParser.d__6f。移动下一个((            在MS。Internal.Xaml.Parser.XamlPullParser.d__14.移动下一个((            在MS。Internal.Xaml.Parser.XamlPullParser.d__7.移动下一个((            在MS。Internal.Xaml.Parser.XamlPullParser.d__0.移动下一个((            在MS。Internal.Xaml.NodeStreamSorter.ReadAheadToEndOfAttributes((            在MS。Internal.Xaml.NodeStreamSorter.ReadAheadAndSortCtorProperties((            在MS。Internal.Xaml.NodeStreamSorter..ctor(XamlParserContext context, XamlPullParser parser, XamlXmlReaderSettings settings, Dictionary'2 xmlnsDictionary(            at System.Xaml.XamlXmlReader.Initialize(XmlReader givenXmlReader, XamlSchemaContext schemaContext, XamlXmlReaderSettings settings(            at System.Xaml.XamlXmlReader..ctor(XmlReader xmlReader, XamlSchemaContext schemaContext, XamlXmlReaderSettings settings(            at System.Windows.Markup.XamlReader.Load(XmlReader reader, ParserContext parserContext, XamlParseMode parseMode(       内部异常:

如果我将晦涩的字符串格式{}{0:;#,##0.00;}替换为';#,##0.00;'则加载成功。不幸的是,我需要的另一种格式(正值的格式(是'#,##0.00;;'的,并且由于某种未知原因,如果值为负,它不会表现为条件格式。(它显示带有符号的负数,而不是按预期不显示任何内容。"括号"版本没有这个问题。

所以我的问题是,当我使用相同的 XAML 构建 WPF 应用程序时,为什么我不能在数据绑定中使用带括号的条件字符串格式XamlReader.Parse当我使用相同的 XAML 构建 WPF 应用程序时

加载具有条件字符串格式的数据绑定的 XAML 失败

这不是实际问题的答案,但这可能对您有所帮助。当绑定定义为标记而不是标记扩展时,加载是可以的:

var xaml = @"<TextBlock
  xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
  <TextBlock.Text>
    <Binding Path=""Value"" StringFormat=""0:;#,##0.00;""/>
  </TextBlock.Text>
</TextBlock>";