[英]WPF: Store XAML in Property and Display in ContentControl
I am deserializing a XML file into a class and then trying to display some XAML (stored in a property in the class) in a ContentControl. 我将XML文件反序列化为一个类,然后尝试在ContentControl中显示一些XAML(存储在该类的属性中)。
Here is my XML: 这是我的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>
This correctly deserializes to a collection of CallStep
objects. 正确反序列化为
CallStep
对象的集合。 Here is what a single CallStep
object looks like: 这是单个
CallStep
对象的外观:
As part of my code I have a CurrentCallStep
which contains a single CallStep
. 作为我的代码的一部分,我有一个
CurrentCallStep
,其中包含一个CallStep
。 I would like to display the XAML contained in StepXaml
within a ContentControl
(or some other container) using something like: 我想使用类似以下内容的
StepXaml
在ContentControl
(或其他容器)中显示包含在StepXaml
的XAML:
in VM: 在VM中:
/// <summary>
/// Current call step object
/// </summary>
public CallStep CurrentCallStep
{
get { return _CurrentCallStep; }
set
{
_CurrentCallStep = value;
NotifyPropertyChanged(m => m.CurrentCallStep);
}
}
private CallStep _CurrentCallStep;
in View: 在视图中:
<!-- CurrentCallStep contains the XAML for the current call steps to be displayed -->
<ContentControl Content="{Binding CurrentCallStep.StepXaml}"
Background="LightBlue"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
This however is not converting the XAML to XAML but rather just showing the text like: 但是,这并不是将XAML转换为XAML,而只是显示如下文本:
How can I get the text in CurrentCallStep.StepXaml
to convert to XAML? 如何在
CurrentCallStep.StepXaml
获取文本以转换为XAML?
You need to use XamlServices.Load()
to deserialize the string from XAML to a FrameworkElement
. 您需要使用
XamlServices.Load()
将字符串从XAML反序列化为FrameworkElement
。 The property that is bounnd to should be a FrameworkElement
reference, not a string
reference. 值得推荐的属性应该是
FrameworkElement
引用,而不是string
引用。
I was able to solve this by extracting the CDATA value from each StepXaml
as follows: 我能够通过从每个
StepXaml
提取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;
The ContentControl
simply refers to the StepXaml
like: ContentControl
只是简单地引用StepXaml
例如:
<!-- CallContent contains the XAML for the current call steps to be displayed -->
<ContentControl Content="{Binding CurrentCallStep.StepXaml}"
Doing it this way I didn't have to do anything special while deserializing the XML. 这样,在反序列化XML时,我不必做任何特别的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.