绑定到ObservableCollection <xmlnode> </xmlnode>的列表上的数据模板的Xpath查询

时间:2012-01-15 17:07:19

标签: c# wpf xml

所以我正在玩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数据源(不少于混合),而不是ObserveableCollection,这与它有关吗?

感谢。

这是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>

2 个答案:

答案 0 :(得分:0)

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

请注意,需要有namespace mappingwithout XmlDataProvider),即使将atom命名空间设置为默认命名空间,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>

答案 1 :(得分:-1)

啊啊......我绑定了一个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}}" />