加载具有条件字符串格式的数据绑定的 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 应用程序时
这不是实际问题的答案,但这可能对您有所帮助。当绑定定义为标记而不是标记扩展时,加载是可以的:
var xaml = @"<TextBlock
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<TextBlock.Text>
<Binding Path=""Value"" StringFormat=""0:;#,##0.00;""/>
</TextBlock.Text>
</TextBlock>";