2010-12-14 41 views
2

Je développe une application Silverlight, et je veux définir le ItemsSource d'un ListBox à ObeservableCollection<XElement> et toujours être en mesure d'utiliser la syntaxe Binding Path=Element[name].Value pour obtenir des valeurs pour un modèle de données. Je peux obtenir la liaison avec succès, mais la syntaxe Element [] ne fonctionne pas. Ça rend juste vide. Par exemple, cela ne fonctionne pas:Les données lient ObservableCollection <XElement> à un 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> 

Mais bizarrement, quelque chose comme cela ne rend le contenu, ce qui me dit que tout est lié à un certain degré, mais quelque chose me tient d'utiliser la propriété élément dynamique:

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

Qu'est-ce que je fais mal?

Répondre

4

Le Element pseudoproperty est uniquement disponible dans la version de bureau de .NET. Il repose sur le système de descripteur de type qui est l'un des éléments du .NET Framework qui manque dans Silverlight.

Dans le cadre complet .NET, XElement a un attribut [TypeDescriptionProvider(typeof(XTypeDescriptionProvider<XElement>))], qui est la manière dont les Element et autres pseudo-propriétés sont exposées à la liaison de données. Cet attribut n'est pas présent dans la version Silverlight de XElement. (Et il ne peut pas être présent car Silverlight ne fournit pas de définition de TypeDescriptionProvider ou de l'une des machines associées derrière cet attribut

Silverlight ne fournit pas un moyen direct de lier au contenu XML. ne supporte pas XPath non plus, ce qui est l'autre solution populaire dans WPF.)

Ceci est une solution relativement complexe, cependant, vous pouvez regarder à Binding XML in Silverlight without nominal classes qui montre un article par Graham Murray qui montre comment générer des types bindables dynamiquement. pense que j'écrirais juste un type de wrapper pour le XML qui inclut les données que je veux, et j'utiliserais LINQ to XML pour peupler ces wrappers à partir du XML

0

Utiliser XPath à la place:

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

EDIT:

Comme Ian a fait remarquer, vous utilisez Silverlight. Donc, XPath ne fonctionnera pas. Pourquoi ne pas utiliser IValueConverter à la place?

Exemple:

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 ne supporte pas XPath donc cela ne fonctionnera pas. –

+0

Enfer, alors pourquoi est-ce marqué comme WPF? Laisse-moi aller le corriger. – decyclone