Я загружаю XAML с помощью XamlReader
, и у меня возникают проблемы с его загрузкой при связывании данных с использованием условного строкового формата. Чтобы быть уверенным, что я не делал никаких синтаксических ошибок, я пробовал условный формат в автономном приложении WPF. Это XAML я использую для проверки:Загрузка 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 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:;#,##0.00;}
с ';#,##0.00;'
нагрузка завершена. К сожалению, другой формат, который мне нужен (один для положительных значений), равен '#,##0.00;;'
, и по какой-то неизвестной причине он не ведет себя как условный формат, если значение отрицательное. (Он отображает отрицательное число со знаком вместо того, чтобы не отображать что-либо, как это должно быть сделано. Версия «скобка» не имеет этой проблемы.)
Так что мой вопрос в том, почему я не могу использовать условное строковый формат с скобками в привязке данных при загрузке XAML с использованием XamlReader.Parse
, когда тот же формат условной строки отлично работает, когда я создаю приложение WPF с использованием того же XAML?