我有一个数据库存储过程调用,除其他列外,它返回一个包含 XML 格式数据的列。我正在尝试在网格中显示此调用的结果(调用是通过实体框架进行的,因此绑定到网格的实际对象是 POCO,有问题的列是string
属性)。
虽然正常列正确显示,但我需要能够获取该列中的 XML 数据并将其内容(它将包含多个节点)绑定到ItemsControl
单元格模板中的一个。
例如,假设我有一个显示以下对象集合的网格:
class Photo
{
string PhotoId { get; set; }
string Name { get; set; }
string TagListXml { get; set; }
}
这旨在表示一张照片,并且该TagListXml
属性包含一个 XML 字符串,其中列出了已应用于该照片的所有标签。类似于...的东西
<PhotoTags>
<Tag>Faces</Tag>
<Tag>People</Tag>
<Tag>Sepia</Tag>
</PhotoTags>
(虽然很明显一个普通的 POCO 会有一个List<string>
或类似的东西,让我们暂时假设我必须使用一个 XML 字符串)
在我的网格中,我希望能够指定一个ItemsControl
使用此 XML 并最终为我提供项目Faces
、People
和Sepia
.
我已经为单元格模板尝试过这个:
<DataTemplate>
<ItemsControl ItemsSource="{Binding TagListXml,
Converter={StaticResource xmlConverter}}" />
</DataTemplate>
wherexmlConverter
是这样定义的:
<dc:StringToXmlConverter x:Key="xmlConverter" XPath="PhotoTags" />
Anddc:StringToXmlConverter
是一个自定义IValueConverter
,它只接受一个字符串值,实例化一个XmlDocument
并加载字符串,然后返回一个XmlDataProvider
带有该新文档和XPath
上面指定的。
虽然这不会在输出窗口中以异常或绑定错误的形式产生任何错误,但它不会做任何事情(没有显示结果)。
我相信这是因为 anXmlDataProvider
不能ItemsSource
直接设置为 a ,而是必须设置为Source
a Binding
。(换句话说,你必须做ItemSource="{Binding Source={StaticResource xmlProvider}}"
而不是ItemsSource="{StaticResource xmlProvider}"
)。
我似乎无能为力,在过去的几个小时里,我一直在努力解决这个问题。
如何将 XML 字符串绑定ItemsSource
到ItemsControl
?