所以我正在玩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 <p>I need fast updates, so I was wondering which one is faster and more efficient.</p>\n\r\n </summary>
答案 0 :(得分:0)
InnerXml
是XML节点的元属性,如果节点有一个直接的子元素title
,那么你可以用XPath访问它,而XPath=atom:title
就足够了。
请注意,需要有namespace mapping(without 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}}" />