2

我正在使用加载 XAML XamlReader,当我使用条件字符串格式进行数据绑定时,我无法加载它。为了确保我没有犯任何语法错误,我在独立的 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; } }

}

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

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

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 发生
  Message='标记扩展结束后出现意外的标记。' 行号“3”和行位置“40”。
  来源=PresentationFramework
  行号=3
  线位置=40
  堆栈跟踪:
       在 System.Windows.Markup.XamlReader.RewrapException(异常 e,Uri baseUri)
       在 System.Windows.Markup.XamlReader.Load(XmlReader 阅读器,ParserContext parserContext,XamlParseMode parseMode)
       在 System.Windows.Markup.XamlReader.Load(XmlReader 阅读器)
       在 System.Windows.Markup.XamlReader.Parse(字符串 xamlText)
       在 WpfApplication\Window.xaml.cs:line 17 中的 WpfApplication.Window..ctor()
  内部异常:System.Xaml.XamlParseException
       Message='标记扩展结束后出现意外的标记。' 行号“3”和行位置“40”。
       源 = System.Xaml
       行号=3
       线位置=40
       堆栈跟踪:
            在 MS.Internal.Xaml.Parser.MePullParser.d__0.MoveNext()
            在 MS.Internal.Xaml.Parser.XamlPullParser.d__6f.MoveNext()
            在 MS.Internal.Xaml.Parser.XamlPullParser.d__14.MoveNext()
            在 MS.Internal.Xaml.Parser.XamlPullParser.d__7.MoveNext()
            在 MS.Internal.Xaml.Parser.XamlPullParser.d__0.MoveNext()
            在 MS.Internal.Xaml.NodeStreamSorter.ReadAheadToEndOfAttributes()
            在 MS.Internal.Xaml.NodeStreamSorter.ReadAheadAndSortCtorProperties()
            在 MS.Internal.Xaml.NodeStreamSorter..ctor(XamlParserContext 上下文,XamlPullParser 解析器,XamlXmlReaderSettings 设置,Dictionary`2 xmlnsDictionary)
            在 System.Xaml.XamlXmlReader.Initialize(XmlReader givenXmlReader、XamlSchemaContext schemaContext、XamlXmlReaderSettings 设置)
            在 System.Xaml.XamlXmlReader..ctor(XmlReader xmlReader、XamlSchemaContext schemaContext、XamlXmlReaderSettings 设置)
            在 System.Windows.Markup.XamlReader.Load(XmlReader 阅读器,ParserContext parserContext,XamlParseMode parseMode)
       内部异常:

{}{0:;#,##0.00;}如果我用';#,##0.00;'加载成功替换晦涩的字符串格式。不幸的是,我需要的另一种格式(用于正值的格式)是'#,##0.00;;',并且由于某种未知的原因,如果值为负,它不会作为条件格式。(它显示带有符号的负数,而不是像它应该做的那样不显示任何东西。“括号”版本没有这个问题。)

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

4

1 回答 1

2

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

var xaml = @"<TextBlock
  xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
  <TextBlock.Text>
    <Binding Path=""Value"" StringFormat=""0:;#,##0.00;""/>
  </TextBlock.Text>
</TextBlock>";
于 2012-04-29T16:22:49.130 回答