代码之家  ›  专栏  ›  技术社区  ›  AnthonyWJones

在Silverlight中绑定XML而不使用标称类

  •  3
  • AnthonyWJones  · 技术社区  · 16 年前

    假设我有一个简单的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绑定到XML和一个标称类:-

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

    没有这门课能做到吗?

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

    编辑

    编辑 :匿名类不起作用,Silverlight无法绑定它们。

    4 回复  |  直到 13 年前
        1
  •  3
  •   Bryant    16 年前

    您可以使用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;
        }
    }
    

    <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");
    

    这不是一种非常优雅的绑定语法,但它确实有效,并且比映射到类更容易。

        3
  •  0
  •   David Padbury    16 年前

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

        4
  •  0
  •   MojoFilter    16 年前

    即。:

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

    我想这应该行得通,但我没有地方可以测试它。如果没有,有人告诉我为什么,因为现在我很感兴趣。