2010-12-14 10 views
2

私はSilverlightアプリケーションを開発しており、ListBoxObeservableCollection<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のデスクトップバージョンでのみ使用可能です。 Silverlightで欠落している.NET Frameworkの1つであるタイプ記述子システムに依存しています。

フル.NETフレームワークでXElementには[TypeDescriptionProvider(typeof(XTypeDescriptionProvider<XElement>))]という属性があります。これは、とその他の擬似プロパティがデータバインディングにどのようにさらされているかを示します。この属性はSilverlightバージョンXElementには存在しません。 (Silverlightは、TypeDescriptionProvider、またはその属性の背後にある関連する機械の定義を提供していないため、存在しないことがあります。

SilverlightはXMLコンテンツに直接バインドする方法を提供していませんWPFで普及している他のソリューションであるXPathもサポートしています)。Binding XML in Silverlight without nominal classesは、バインド可能な型を動的に生成する方法を示すGraham Murrayの記事にリンクしています。これは比較的複雑な解決策です。私が必要とするデータを含む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