2010-02-26 111 views
1

有人可以幫我,爲什麼我的列表框是空的?綁定列表框到XmlDocument

XmlDocument的包含以下XML:

<Config> 
    <Tabs> 
    <Tab Name="Test1" /> 
    <Tab Name="Test2" /> 
    </Tabs> 
</Config> 

在我的XAML文件我曾嘗試以下

<Window> 
    <Grid> 
    <ListBox DataContext="{Binding {StaticResource Data}, XPath=//Tabs}" ItemsSource="{Binding XPath=Tab/@Name}"> 
    </ListBox> 
    </Grid> 
<Window> 

我知道我沒有設置綁定到name屬性,但不應該」如果它正在工作,那麼爲每個Tab節點顯示XmlDocument.XmlNode.ToString()?

我的C#構造函數代碼後面:

InitializeComponent(); 
this.doc = new XmlDocument(); 
doc.LoadXml(config.document.OuterXml); 
XmlDataProvider provider = (XmlDataProvider)Resources["Data"]; 
provider.Document = doc; 
provider.Refresh(); 

隨着config.document.OuterXml是含有上述的XML有效的文檔。

我得到這與使用集合的程序代碼的工作,但我一直想弄清楚如何直接綁定到XML。

更新:列表框空

現在沒有約束力的錯誤,但我的列表框快到了空,我有雙重檢查我的XML文件,甚至做MessageBox.Show(provider.Document.OuterXML),並能確認XmlDocument確實有正確的節點。

在此先感謝

+1

我沒有做任何的數據綁定到XML文檔尚未...但你在你的輸出窗口看看看你是否收到任何數據綁定錯誤? – Dave

+0

謝謝你,神iv'e現在一直在使用數據綁定數週,我總是忘記檢查輸出窗口。我編輯我的帖子來添加我的錯誤,而我仍然試圖解決這個問題。 –

回答

4

如果設置了XmlDataProviderDocument屬性爲您XmlDocument,這將刷新綁定XmlNode.NodeChanged事件引發的任何時間。由於Document不是依賴項屬性,因此您不能綁定到它,因此您必須將其設置爲代碼;這應該做的伎倆:

在您的XAML:

<Window.Resources> 
    <XmlDataProvider x:Key="Data"/> 
</Window.Resources> 

... 

<ListBox 
    DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}" 
    ItemsSource="{Binding XPath=Tab/@Name}"/> 

在窗口的構造函數:

InitializeComponent(); 
XmlDocument d = new XmlDocument(); 
d.Load("MyData.xml"); 
XmlDataProvider p = (XmlDataProvider)Resources["Data"]; 
p.Document = d; 

現在您對XmlDocument的任何更改將在ListBox反映。

編輯:

我不能告訴你,你做錯了什麼,但也許你就可以在比較你與下面做什麼,這是一個完整的工作,以例。

Window1.xaml:

<Window x:Class="Test.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1"> 
    <Window.Resources> 
     <XmlDataProvider x:Key="Data"/> 
    </Window.Resources> 
    <ListBox 
     DataContext="{Binding Source={StaticResource Data}, XPath=Config}" 
     ItemsSource="{Binding XPath=Tabs/Tab/@Name}"/>  
</Window> 

Window1.xaml.cs:

using System.Windows; 
using System.Windows.Data; 
using System.Xml; 

namespace Test 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      XmlDocument d = new XmlDocument(); 
      string xml = @"<Config><Tabs><Tab Name='foo'/><Tab Name='bar'/></Tabs></Config>"; 
      d.LoadXml(xml); 
      ((XmlDataProvider) Resources["Data"]).Document = d; 
     } 
    } 
} 
+0

謝謝你,我會在星期一上班,看看它是否有效:)。我猜是沒有辦法在XAML中執行此操作(將xmldataprovider綁定到XmlDocument? –

+1

對,因爲'Document'屬性不是依賴項屬性,而且只能綁定到依賴項屬性 –

+0

WPF是當我把DataContext =「{Binding {StaticResource Data},XPath = Config/Tabs}」並且谷歌不是來的時候,我現在變得「無法創建類型'綁定'的實例」坦克注意關於羅伯特上的依賴屬性:) –