2012-01-15 54 views
0

所以我正在玩WPF中的一些異步的東西,我試圖加載一些組合框的一些XML數據我從堆棧溢出提要回來,我得到數據沒有問題,我可以看到組合框正在填充,但我似乎無法獲得帖子的標題。我已經嘗試了一些東西,但事實是,我只是沒有用過很多XML數據,也不知道我在做什麼。Xpath查詢綁定到ObservableCollection的列表上的數據模板<XmlNode>

這裏是我的數據模板

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

正如你可以看到,我試圖讓「InnerXML /標題」 - 不工作,我已經嘗試過其他幾件事情。這裏是我填充列表

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> 
+0

節點在XML結構方面看起來像什麼? – 2012-01-15 17:10:39

+0

這就是爲什麼我困惑的InnerXml的價值看起來像這樣, ... 所以我想我可以只說InnerXml /標題,它會工作。 – Kenn 2012-01-15 17:28:48

+1

那麼「title」是XML結構中的一個標籤嗎?是否有可能給出節點模式的示例,以便我們可以提出更好的建議? – FarligOpptreden 2012-01-15 17:36:48

回答

0

InnerXml是XML節點,它不是你可以使用XPath訪問的元屬性,如果節點有一個直接子元素title然後XPath=atom:title應該夠了。

請注意,需要有一個namespace mappingwithout XmlDataProvider),並且儘管原子名稱空間被設置爲默認名稱空間,但查詢需要限定這些元素。

具體的例子:

//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> 
+0

是的,那是我的第一次嘗試,Xpath = title,但是當那個不起作用時,我被派去釣魚,嗯?它顯然確實有一個標題,我知道,因爲我已經看了aw XML。 – Kenn 2012-01-15 20:55:03

+0

@Kenn:您仍然應該提供節點的完整XML並查看是否存在[綁定錯誤](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings -in-A-WPF的或-Silverlight的application.aspx)。 – 2012-01-15 20:56:45

+0

我知道沒有綁定錯誤 - 我只是設置IsSynchronizedWithCurrentItem =「True」,我可以看到XML設置,我甚至創建了一個名爲XmlString的屬性,並返回SelectedXmlNode.InnerXml,並將其綁定到一個文本框作品。我唯一的問題是在combox box datatemplate上做一個XPath查詢,我做錯了我無法弄清楚。 – Kenn 2012-01-15 21:11:56

-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}}" /> 
+0

你錯了。如果你仍然不相信我,你可以嘗試我添加到我的答案的例子。 – 2012-01-24 21:23:46

相關問題