2010-12-14 6 views
2

Я разрабатываю приложение Silverlight и хочу установить ItemsSourceListBox в ObeservableCollection<XElement> и по-прежнему использовать синтаксис Binding Path=Element[name].Value для получения значений для шаблона данных. Я могу получить привязку успешно, но синтаксис Element [] не работает. Он просто пуст. Например, это не работает:Передача данных ObservableCollection <XElement> в ListBox?

<DataTemplate x:Key="SearchResultsTemplate"> 
    <ListBox ItemsSource="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Path=Element[key].Value}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</DataTemplate> 

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

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

Что я делаю неправильно?

ответ

4

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

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

Silverlight не обеспечивает прямой способ привязки к XML-контенту. 't поддерживает XPath, что является другим решением, популярным в WPF.) Вы можете посмотреть на Binding XML in Silverlight without nominal classes, который ссылается на статью Грэма Мюррея, которая показывает, как динамически создавать типы с возможностью связывания.

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

0

Использование 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(); 
    } 
} 
+0

Silverlight d не поддерживает XPath, так что это не сработает. –

+0

Черт, тогда почему это помечено как WPF? Позвольте мне пойти и исправить это. – decyclone

 Смежные вопросы

  • Нет связанных вопросов^_^