Data将ObservableCollection <xelement>绑定到ListBox?</xelement>

时间:2010-12-14 10:03:37

标签: c# silverlight linq data-binding xelement

我正在开发一个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>

我做错了什么?

2 个答案:

答案 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();
    }
}