3

XMLの単純なチャンクがあるとしましょう:-

<root>
   <item forename="Fred" surname="Flintstone" />
   <item forename="Barney" surname="Rubble" />
</root>

このXMLをSilverlightでフェッチしたので、このilkeのXAMLとバインドしたいと思います:-

<ListBox x:Name="ItemList" Style="{StaticResource Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">           
                <TextBox Text="{Binding Forename}" />
                <TextBox Text="{Binding Surname}" />  
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox> 

これで、LINQを使用してXMLと名詞クラスに簡単にバインドできます。-

public class Person {
     public string Forename {get; set;} 
     public string Surname {get; set;}
}

このクラスなしでそれを行うことはできますか?

つまり、Silverlightコードと入力XMLの間の結合は、XAMLのみに制限され、他のソースコードはitem要素の属性のセットに依存しません。

編集:XSDの使用が提案されていますが、最終的には同じ量になります。XSD->生成されたクラス。

編集:匿名クラスは機能しません。Silverlightはそれらをバインドできません。

編集:これは双方向である必要があります。ユーザーは値を編集できる必要があり、これらの値は最終的にXMLになります。(上記のサンプルでは、​​元のTextBlockをTextBoxに変更しました。)

4

4 に答える 4

3

これは IValueConverter で行うことができます。ここに簡単なものがあります:

public class XAttributeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var xml = value as XElement;
        var name = parameter as string;
        return xml.Attribute(name).Value;
    }
}

次に、Xaml で型コンバーターを参照し、属性名をパラメーターとして渡すことができます。

<ListBox x:Name="ItemList">
    <ListBox.Resources>
        <local:XAttributeConverter x:Name="xcvt" />
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Converter={StaticResource xcvt}, ConverterParameter=forename}" />
                <TextBlock Text="{Binding Converter={StaticResource xcvt}, ConverterParameter=surname}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

これは、XElement にロードされた xml にバインドする場合です。

XElement xml = XElement.Parse("<root><item forename='Fred' surname='Flintstone' /><item forename='Barney' surname='Rubble' /></root>");

ItemList.ItemsSource = xml.Descendants("item");

非常に洗練されたバインディング構文ではありませんが、機能し、クラスへのマッピングよりも簡単です。

于 2008-12-04T17:07:36.840 に答える
2

詳細については、「 Silverlight での匿名型へのバインド」を参照してください。

于 2010-06-05T18:58:57.930 に答える
0

匿名クラスを使用するクエリで Bryant が提案していることと同様のことができますか?

すなわち:

var data = from c in xml.Descendants("item")
                       select new  { Forename = c.Attribute("forename").Value, 
                                     Surname = c.Attribute("surname").Value };
ItemList.ItemsSource = data

これでうまくいくと思いますが、テストできる場所がありません。そうでない場合は、誰かが理由を教えてくれます。

于 2008-12-04T17:58:55.443 に答える
0

私の知る限り、Silverlight Binding には WPF にある XPath プロパティがないため、XML に直接バインドする良い方法はありません。この問題に遭遇したとき、スキーマに対して xsd.exe を使用してクラスを生成し、Xml シリアル化を使用してそれらを設定しました。理想的ではありませんが、少なくとも私はクラスとマッピングを自分で作成および保守していません。

于 2008-12-04T14:24:57.903 に答える