针对绑定到ObservableCollection<;XmlNode>;

本文关键字:lt XmlNode gt ObservableCollection 绑定 | 更新日期: 2023-09-27 18:20:26

所以我在WPF中玩一些异步的东西,我试图用我从堆栈溢出提要中提取的一些XML数据加载一个组合框,我得到的数据没有问题,我可以看到组合框正在填充,但我似乎无法得到文章的标题。我已经尝试了一些方法,但事实是,我只是没有那么多地使用XML数据,也不知道自己在做什么。

这是我的数据模板

<ComboBox.ItemTemplate>
  <DataTemplate>
    <Border Background="Azure" Margin="1" Height="24" Width="100">
      <Label Content="{Binding XPath=InnerXml/title}" />
    </Border>
  </DataTemplate>
</ComboBox.ItemTemplate>

正如你所看到的,我正在尝试获得"InnerXML/title"——这不起作用,我已经尝试了其他几种方法。这是我填充列表的地方

private async Task LoadListAsync(string url, int sleep)
    {
        Task<XmlNodeList> task = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(sleep);
            return GetFeed(url);
        });
        Log("In LoadListAsync before await");
        var list = await task;
        foreach (XmlNode node in list)
        {
            List.Add(node);
        }
        Log("In LoadListAsync, after await"); 
    }

正如我所说,我可以看到foreach循环进行,列表填充——我知道这一点,因为我可以从模板中看到边界,我只是似乎无法创建XPath查询来获得标题。

有人能帮忙吗?在过去的任何时候,我都使用XML数据源(混合使用),而不是ObserverableCollection,这与此有关吗?

谢谢。

这是XML结构-我可以在我将SelectedXml绑定到.的文本框中看到它

<id xmlns='"http://www.w3.org/2005/Atom'">http://stackoverflow.com/q/8872600</id><re:rank scheme='"http://stackoverflow.com'" xmlns:re='"http://purl.org/atompub/rank/1.0'">0</re:rank><title type='"text'" xmlns='"http://www.w3.org/2005/Atom'">
Which is faster to use binding using converter or update in a property changed callback?</title>
<category scheme='"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags'" term='"wpf'" xmlns='"http://www.w3.org/2005/Atom'" />
<category scheme='"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags'" term='"binding'" xmlns='"http://www.w3.org/2005/Atom'" />
<category scheme='"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags'" term='"delegates'" xmlns='"http://www.w3.org/2005/Atom'" />
<category scheme='"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags'" term='"callback'" xmlns='"http://www.w3.org/2005/Atom'" />
<category scheme='"http://stackoverflow.com/feeds/tag?tagnames=wpf/tags'" term='"propertychanged'" xmlns='"http://www.w3.org/2005/Atom'" />
<author xmlns='"http://www.w3.org/2005/Atom'"><name>mihajlv</name><uri>http://stackoverflow.com/users/906042</uri></author>
<link rel='"alternate'" href='"http://stackoverflow.com/questions/8872600/which-is-faster-to-use-binding-using-converter-or-update-in-a-property-changed-c'" 
xmlns='"http://www.w3.org/2005/Atom'" />
<published xmlns='"http://www.w3.org/2005/Atom'">2012-01-15T19:23:34Z</published>
<updated xmlns='"http://www.w3.org/2005/Atom'">2012-01-15T19:23:34Z</updated>
<summary type='"html'" xmlns='"http://www.w3.org/2005/Atom'">'r'n            &lt;p&gt;I need fast updates, so I was wondering which one is faster and more efficient.&lt;/p&gt;'n'r'n        </summary>

针对绑定到ObservableCollection<;XmlNode>;

InnerXml是XML节点的元属性,它不是您可以使用XPath访问的属性,如果节点具有直接子元素title,那么XPath=atom:title就足够了。

请注意,需要有一个命名空间映射(没有XmlDataProvider),即使原子命名空间被设置为默认命名空间,XPath查询也需要限定元素。

具体示例:

//Contains all 'entry' nodes.
private readonly ObservableCollection<XmlNode> _XmlData = new ObservableCollection<XmlNode>();
public ObservableCollection<XmlNode> XmlData { get { return _XmlData; } }
<ComboBox ItemsSource="{Binding XmlData}">
    <Binding.XmlNamespaceManager>
        <XmlNamespaceMappingCollection>
            <XmlNamespaceMapping Prefix="atom" Uri="http://www.w3.org/2005/Atom" />
        </XmlNamespaceMappingCollection>
    </Binding.XmlNamespaceManager>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding XPath=atom:title}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

啊。。。我绑定到ObservableCollecion,当然我不能在其中使用XPath查询,就WPF而言,它是一个对象,就像我绑定到了人员、项目或其他对象的集合一样。

我需要创建一个转换器,我没有绑定到XML,而是绑定到一个XmlNode,它是一个对象。这是转换器。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var node = (XmlNode)value;
         if (node["title"].InnerText == null)
                return "(no title)";
            return node["title"].InnerText;
    }

这是正确的装订。

<Label Content="{Binding Converter={StaticResource XmlNodeToTitleStringConverter}}" />