2012-04-28 3 views
2

Я загружаю 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?

ответ

1

Это не ответ на реальный вопрос, но это может быть полезно для вас. Загрузка выполняется нормально, если привязка определена как бирка, а не расширение разметки:

var xaml = @"<TextBlock 
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
    <TextBlock.Text> 
    <Binding Path=""Value"" StringFormat=""0:;#,##0.00;""/> 
    </TextBlock.Text> 
</TextBlock>"; 

 Смежные вопросы

  • Нет связанных вопросов^_^