3

假设我有一个简单的 XML 块:-

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

在 Silverlight 中获取此 XML 后,我想将其与此类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 to XML 和一个名义类进行绑定:-

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

没有这个类可以吗?

换句话说,Silverlight 代码和输入 XML 之间的耦合仅限于 XAML,其他源代码与项元素上的属性集无关。

编辑:建议使用 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

据我所知,Silverlight 绑定缺少 WPF 中的 XPath 属性,因此没有直接绑定到 XML 的好方法。当我遇到这个问题时,我使用 xsd.exe 针对模式来生成我的类,然后使用 Xml 序列化来填充它们。这并不理想,但至少我不是自己编写和维护类和映射。

于 2008-12-04T14:24:57.903 回答
0

你能做一些类似于 Bryant 建议的使用匿名类的查询吗?

IE:

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 回答