c# - 加载具有条件字符串格式数据绑定(bind)的 XAML 失败

标签 c# wpf xaml string-formatting xamlreader

我正在使用 XamlReader 加载 XAML,但在使用条件字符串格式进行数据绑定(bind)时加载它时遇到问题。为了确保我没有犯任何语法错误,我在独立的 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 occurred
  Message='Unexpected token after end of markup extension.' Line number '3' and line position '40'.
  Source=PresentationFramework
  LineNumber=3
  LinePosition=40
  StackTrace:
       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
       Message='Unexpected token after end of markup extension.' Line number '3' and line position '40'.
       Source=System.Xaml
       LineNumber=3
       LinePosition=40
       StackTrace:
            at MS.Internal.Xaml.Parser.MePullParser.d__0.MoveNext()
            at MS.Internal.Xaml.Parser.XamlPullParser.d__6f.MoveNext()
            at MS.Internal.Xaml.Parser.XamlPullParser.d__14.MoveNext()
            at MS.Internal.Xaml.Parser.XamlPullParser.d__7.MoveNext()
            at MS.Internal.Xaml.Parser.XamlPullParser.d__0.MoveNext()
            at MS.Internal.Xaml.NodeStreamSorter.ReadAheadToEndOfAttributes()
            at MS.Internal.Xaml.NodeStreamSorter.ReadAheadAndSortCtorProperties()
            at 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)
       InnerException: 

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

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

最佳答案

这不是实际问题的答案,但这可能对您有帮助。当 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>";

关于c# - 加载具有条件字符串格式数据绑定(bind)的 XAML 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367548/

相关文章:

c# - 在asp.net中选中复选框时弹出窗口

c# - 对 REST 服务的 WebClient 调用在控制台应用程序中有效,但在 asp.net 中无效

c# - 格式化 MultiBinding TimeSpan 以隐藏毫秒

c# - 为什么 IComparer 要求您定义 IComparer.Compare(Object x, Object y) 而不仅仅是 Compare(Object x, Object y)?

c# - 第三方应用程序要求旧程序集

wpf - 在不同的 UI 线程中打印 DocumentViewer 的内容

WPF 滚动查看器 : Horizontal scrolling doesn't work

wpf - WrapPanel 中的 VerticalAlignment - 如何使其正常工作?

xaml - 银光 : Not naming controls in XAML when using MVVM (Silverlight)?

c# - TreeView 项目序列化