2015-03-11 4 views
0

Я десериализую XML-файл в класс, а затем пытаюсь отобразить некоторый XAML (хранящийся в свойстве в классе) в ContentControl.WPF: Хранить XAML в свойствах и отображениях в ContentControl

Вот мой XML:

<CallSteps> 
    <CallStep> 
    <StepID>20</StepID> 
    <StepName>Intro</StepName> 
    <StepXaml> 
     <![CDATA[<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:uc="clr-namespace:CallTracker.Library.UserControls.BaseUserControls;assembly=CallTracker.Library"> 
      <uc:LabelValueControl Label="TestLabel" Value="356733" /> 
      </StackPanel>]]> 
    </StepXaml> 
    </CallStep> 

    <CallStep> 
    <StepID>30</StepID> 
    <StepName>Intro</StepName> 
    <StepXaml> 
     <![CDATA[<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:uc="clr-namespace:CallTracker.Library.UserControls.BaseUserControls;assembly=CallTracker.Library"> 
      <uc:LabelValueControl Label="TestLabel2" Value="356738124315" /> 
      </StackPanel>]]> 
    </StepXaml> 
    </CallStep> 
</CallSteps> 

Это правильно десериализует к коллекции CallStep объектов. Вот что один CallStep объект выглядит следующим образом:

enter image description here

Как часть моего кода у меня есть CurrentCallStep, который содержит один CallStep. Я хотел бы, чтобы отобразить XAML, содержащийся в StepXaml внутри ContentControl (или какой-либо другой контейнер), используя что-то вроде:

в VM:

/// <summary> 
/// Current call step object 
/// </summary> 
public CallStep CurrentCallStep 
{ 
    get { return _CurrentCallStep; } 
    set 
    { 
     _CurrentCallStep = value; 
     NotifyPropertyChanged(m => m.CurrentCallStep); 
    } 
} 
private CallStep _CurrentCallStep; 

в Вид:

<!-- CurrentCallStep contains the XAML for the current call steps to be displayed --> 
<ContentControl Content="{Binding CurrentCallStep.StepXaml}" 
       Background="LightBlue" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center" /> 

Это, однако, не преобразовывая XAML в XAML, а просто отображая текст:

enter image description here

Как я могу получить текст в CurrentCallStep.StepXaml для преобразования в XAML?

ответ

0

я смог решить эту проблему путем извлечения значения CDATA из каждого StepXaml следующим образом:

/// <summary> 
    /// Step XAML 
    /// </summary> 
    [XmlElement("StepXaml")] 
    public object StepXaml 
    { 
     get { return _StepXaml; } 
     set 
     { 
      if (_StepXaml != value) 
      { 
       object _obj; 
       using (MemoryStream stream = new MemoryStream()) 
       { 
        // Convert the text into a byte array so that 
        // it can be loaded into the memory stream. 
        XmlNode _node = (value as XmlNode[])[0]; 
        if (_node is XmlCDataSection) 
        { 
         XmlCDataSection _cDataSection = _node as XmlCDataSection; 
         byte[] bytes = Encoding.UTF8.GetBytes(_cDataSection.Value); 


         // Write the XAML bytes into a memory stream. 
         stream.Write(bytes, 0, bytes.Length); 

         // Reset the stream's current position back 
         // to the beginning so that when it is read 
         // from, the read begins at the correct place. 
         stream.Position = 0; 

         // Convert the XAML into a .NET object. 
         _obj = XamlReader.Load(stream); 

         _StepXaml = _obj; 
         NotifyPropertyChanged(m => m.StepXaml); 
        } 
       } 
      } 
     } 
    } 
    private object _StepXaml; 

ContentControl просто относится к StepXaml как:

<!-- CallContent contains the XAML for the current call steps to be displayed --> 
    <ContentControl Content="{Binding CurrentCallStep.StepXaml}" 

Делая это таким образом, я Бесполезный При десериализации XML нужно делать что-то особенное.

0

Вам необходимо использовать XamlServices.Load() для десериализации строки из XAML на FrameworkElement. Свойство, которое является bounnd должно быть ссылкой FrameworkElement, а не ссылкой string.