2010-08-02 38 views
1

我有以下結構的XML文件:WPF,XML數據綁定到依賴/級聯組合框

<Products> 
    <Product name="MyProduct1"> 
    <Components> 
     <Component name="MyComponent1"> 
     <SubComponents> 
      <SubComponent name="MySubComponent1"/> 
      <SubComponent name="MySubComponent2"/> 
      ...more SubComponent nodes... 
     </SubComponents> 
     </Component> 
     ...more Component nodes... 
    </Components> 
    </Product> 
    ...more Product nodes... 
</Products> 

我試圖創建一個具有與它的產品名稱組合框一個WPF應用程序。我對WPF完全陌生,所以我不知道我是否以正確的方式處理事情。選擇產品時,應該使用該產品的所有組件填充第二個組合框。當選擇一個組件時,第三個組合框應該填充該組件的所有子組件。

我不知道如何設置組合框之間的依賴關係,除了在由獨立組合框觸發的事件處理程序中填充依賴組合框之外。這似乎意味着我需要能夠讀取C#中的XML,所以我有[Serializable]Products,,ComponentSubComponent。不過,我試圖做XML數據綁定在我的XAML:

<Window.Resources> 
    <XmlDataProvider Source="Products.xml" 
        XPath="Products/Product" 
        x:Key="productsXml"/> 
</Window.Resources> 

我目前不在我的第一個組合框看到產品名稱的列表,其XAML如下:

<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0" 
      Name="cbo_product" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding Source=productsXml, [email protected]}" 
      SelectionChanged="product_SelectionChanged"/> 

的產品XML應該是隻讀的 - 用戶將無法從應用程序更改XML中的任何值。我只想讀取XML數據並將其顯示在應用程序中。

我有幾個問題:

  1. 我要對這個正確?擁有一個獨立的XML文件,我的WPF應用程序可以讀取這些文件,其中包含表示XML文件中節點的類,用於從C#中的這些節點提取數據,使用事件處理程序編寫ComboBox之間的依賴關係等。
  2. 我的產品名稱(例如MyProduct1)是否顯示在我的ComboBox中?目前它只顯示爲空。
  3. 看起來好像有[Serializable]類代表我的XML節點是多餘/不必要的,因爲XAML已經有了XmlDataProvider/XPath的東西。是這樣嗎?

編輯:

更新我的組合框的XAML以下,現在我看到在ComboBox我的產品名稱的列表,這要歸功於decyclone's answer

<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0" 
      Name="cbo_product" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding Source={StaticResource productsXml}}" 
      DisplayMemberPath="@name" 
      SelectionChanged="product_SelectionChanged"/> 

回答

2

好的,因爲我找到了我的more specific question的答案,我想我也知道這個問題的答案。我不需要[Serializable]類,針對不同的節點在我的XML,因爲我可以只使用XAML和XPath創建級聯/取決於組合框:

<!-- Independent --> 
<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,116,0,0" 
      Name="cbo_product" VerticalAlignment="Top" Width="120" 
      ItemsSource="{Binding Source={StaticResource productsXml}}" 
      DisplayMemberPath="@name"/> 

<!-- Dependent --> 
<ComboBox Height="23" HorizontalAlignment="Left" Margin="138,151,0,0" 
      Name="cbo_component" VerticalAlignment="Top" Width="201" 
      DataContext="{Binding ElementName=cbo_product, Path=SelectedItem}" 
      ItemsSource="{Binding XPath=Components/Component}" 
      DisplayMemberPath="@name"/> 
2

ItemsSource屬性應該是設置爲將在列表中顯示的項目集合,即您的案例中的XmlDataProvider。用戶StaticResource定位它,因爲它被定義爲資源。應該使用DisplayMemberPath屬性來選擇應該使用哪些屬性來顯示組合框中的文本。

關於你的第一個(& 3ed)問題,我個人喜歡創建類,而不是使用原始XML。它給我幾個好處,如

  • 添加包裝屬性。例如,FullName = FirstName +「」+ LastName屬性。

  • 我不必檢查空值和每次我想要訪問的值(總是字符串)類型安全。

  • 我可以將自己的行爲添加爲對於做小任務可能非常有用的方法。

  • 控制序列化方法並使用屬性注入自定義邏輯。

問題是,它值得嗎?你真的關心這些好處嗎?這就像在DataReader和DataSet之間進行選擇一樣。對於只讀和僅顯示目的,使用原始XML,如果您打算使用它,請使用類。

+1

這裏是如何做到這一點的好例子。 http://msdn.microsoft.com/en-us/library/system.windows.data.xmldataprovider.aspx – decyclone 2010-08-02 14:43:40

+0

這回答了我的問題2)。 :) 謝謝! – 2010-08-02 15:00:13