Данные связывают ObservableCollection <XElement>с ListBox? - PullRequest
2 голосов
/ 14 декабря 2010

Я занимаюсь разработкой приложения Silverlight и хочу установить для ItemsSource для ListBox значение ObeservableCollection<XElement>, и все еще иметь возможность использовать синтаксис 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>

Но, как ни странно, что-то вроде этого действительно воспроизводит контент, который говорит мне, что все в некоторой степени связано, но что-то мешает мне использовать динамическое свойство Element:

<DataTemplate x:Key="SearchResultsTemplate">
    <ListBox ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=FirstNode}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DataTemplate>

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 14 декабря 2010

Псевдосвойство Element доступно только в настольной версии .NET.Он опирается на систему дескрипторов типов, которая является одной из частей .NET Framework, отсутствующей в Silverlight.

В полной .NET Framework, XElement имеет атрибут [TypeDescriptionProvider(typeof(XTypeDescriptionProvider<XElement>))], то естьElement и другие псевдосвойства подвергаются привязке данных.Этот атрибут отсутствует в версии Silverlight XElement.(И он не может присутствовать, потому что Silverlight не предоставляет определения TypeDescriptionProvider или какого-либо связанного механизма за этим атрибутом.

Silverlight не предоставляет прямой способ привязки к содержимому XML. (Он также не поддерживает XPath, который является другим популярным решением в WPF.) Вы можете посмотреть Связывание XML в Silverlight без номинальных классов , которое ссылается на статью Грэма Мюррея, в которой показано, как генерировать.связываемые типы динамически.

Это довольно сложное решение, хотя я думаю, что я просто напишу тип оболочки для XML, который включает в себя нужные данные, и использую LINQ to XML, чтобы заполнить эти оболочки из XML.

0 голосов
/ 14 декабря 2010

Используйте XPath вместо:

<TextBlock Text="{Binding XPath=<..YourXPathSyntax..>}" />

EDIT:

Как указал Ян, вы используете 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();
    }
}
...