我正在开发一个Silverlight应用程序,并希望将ItemsSource
的{{1}}设置为ListBox
,并且仍然可以使用ObeservableCollection<XElement>
语法来获取值用于数据模板。我可以成功获得绑定,但Element []语法不起作用。它只是渲染空。例如,这不起作用:
Binding Path=Element[name].Value
但奇怪的是,像这样的东西会渲染内容,这告诉我一切都在某种程度上受到限制,但有些东西使我无法使用Element动态属性:
<DataTemplate x:Key="SearchResultsTemplate">
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Element[key].Value}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
我做错了什么?
答案 0 :(得分:4)
Element
伪表格仅适用于.NET的桌面版本。它依赖于类型描述符系统,它是Silverlight中缺少的.NET Framework之一。
在完整的.NET框架中,XElement
具有[TypeDescriptionProvider(typeof(XTypeDescriptionProvider<XElement>))]
属性,这就是那些Element
和其他伪属性暴露于数据绑定的方式。此属性不存在于XElement
的Silverlight版本中。 (并且它不能出现,因为Silverlight不提供TypeDescriptionProvider
的定义,或该属性背后的任何相关机制。
Silverlight不提供绑定到XML内容的直接方法。 (它也不支持XPath,这是WPF中流行的另一种解决方案。)你可以看看Binding XML in Silverlight without nominal classes链接到Graham Murray的一篇文章,该文章展示了如何动态生成可绑定类型。
但这是一个相对复杂的解决方案。我想我只是为包含我想要的数据的XML编写一个包装器类型,并使用LINQ to XML从XML中填充这些包装器。
答案 1 :(得分:0)
改为使用XPath:
<TextBlock Text="{Binding XPath=<..YourXPathSyntax..>}" />
编辑:
正如伊恩指出的那样,你正在使用Silverlight
。因此,XPath
将不起作用。为什么不使用IValueConverter
?
示例:
using System.Xml.Linq;
using System.Xml.XPath;
public class IXPathConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
String xpath = (String)parameter;
XElement element = (XElement)value;
return element.Document.XPathSelectElement(xpath);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}