针对绑定到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 <p>I need fast updates, so I was wondering which one is faster and more efficient.</p>'n'r'n </summary>
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}}" />