【问题标题】:Data bind ObservableCollection<XElement> to a ListBox?数据绑定 ObservableCollection<XElement> 到 ListBox?
【发布时间】:2010-12-14 10:03:36
【问题描述】:

我正在开发 Silverlight 应用程序,并希望将 ListBoxItemsSource 设置为 ObeservableCollection&lt;XElement&gt;,并且仍然能够使用 Binding Path=Element[name].Value 语法来获取数据模板的值。我可以成功获取绑定,但 Element[] 语法不起作用。它只是呈现为空。例如,这不起作用:

<DataTemplate x:Key="SearchResultsTemplate">
    <ListBox ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Element[key].Value}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DataTemplate>

但奇怪的是,像这样的东西确实会渲染内容,这告诉我一切都在某种程度上受到了约束,但有些东西让我无法使用 Element 动态属性:

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

我做错了什么?

【问题讨论】:

    标签: c# silverlight linq data-binding xelement


    【解决方案1】:

    Element 伪属性仅在 .NET 桌面版本中可用。它依赖于类型描述符系统,这是 Silverlight 中缺少的 .NET 框架的一部分。

    在完整的 .NET 框架中,XElement 有一个[TypeDescriptionProvider(typeof(XTypeDescriptionProvider&lt;XElement&gt;))] 属性,这就是那些Element 和其他伪属性暴露给数据绑定的方式。此属性在 XElement 的 Silverlight 版本中不存在。 (而且它不能存在,因为 Silverlight 没有提供TypeDescriptionProvider 的定义,或者该属性背后的任何相关机制。

    Silverlight 不提供绑定到 XML 内容的直接方法。 (它也不支持 XPath,这是 WPF 中流行的另一种解决方案。)您可以查看 Binding XML in Silverlight without nominal classes,它链接到 Graham Murray 的一篇文章,该文章展示了如何动态生成可绑定类型。

    不过,这是一个相对复杂的解决方案。我想我只是为包含我想要的数据的 XML 编写一个包装器类型,然后使用 LINQ to XML 从 XML 填充这些包装器。

    【讨论】:

      【解决方案2】:

      改用 XPath:

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

      编辑:

      正如 Ian 指出的,您使用的是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();
          }
      }
      

      【讨论】:

      • 见鬼,那为什么这被标记为 WPF?让我去纠正它。
      猜你喜欢
      • 2014-09-28
      • 2018-09-11
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多