我正在使用 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/