2012-01-20 40 views
0

首先抱歉的標題。我知道這不是很清楚,但我想不出別的。如果有人希望我改變它,請提出您的建議(請注意,downvoting不是這裏的正確解決方案),謝謝。 現在我的問題。 我有一個XML看起來像這樣的:高級綁定(首先到xml然後到別的東西)

<scenarios-list> 


<scenario name="Fuori casa" value="fuori-casa"> 
    <lights> 
     <lights-group name="soggiorno"> 
      <lights-item name="portone" outputChannelName="Luci|Appartamento|Portone|DO_Stato" inputChannelName="Luci|Appartamento|Portone|DI_On_Off">off</lights-item> 
      <lights-item name="soggiorno-principale" outputChannelName="Luci|Appartamento|Soggiorno_Principale|DO_Stato" inputChannelName="Luci|Appartamento|Soggiorno_Principale|DI_On_Off">off</lights-item> 
      <lights-item name="soggiorno-secondario" outputChannelName="Luci|Appartamento|Soggiorno_Secondario|DO_Stato" inputChannelName="Luci|Appartamento|Soggiorno_Secondario|DI_On_Off">off</lights-item> 
      <lights-item name="parete-zona-cucina" outputChannelName="Luci|Appartamento|Parete_Zona_Cucina|DO_Stato" inputChannelName="Luci|Appartamento|Parete_Zona_Cucina|DI_On_Off">off</lights-item> 
      <lights-item name="finestra-soggiorno" outputChannelName="Luci|Appartamento|Finestra_Soggiorno|DO_Stato" inputChannelName="Luci|Appartamento|Finestra_Soggiorno|DI_On_Off">off</lights-item> 
     </lights-group> 

     ... (lots of <lights-group> here) 

    </lights> 

    ... (lots of <lights> here) 

</scenario> 

...(lots of <scenario> here) 

</scenarios-list> 

我有一個用戶控件中,用戶可以查看和編輯此情景:所以基本上

<Grid Name="BaseGrid"> 

     <Grid.Resources> 
      <XmlDataProvider **x:Name="ScenesXmlName"** x:Key="ScenesXml" XPath="scenari-list/scenario" Source="C:\Users\andrea\RSSReaderSubscriptions-5.xml"/> 
     </Grid.Resources> 

     <ComboBox Name="ScenariCombo" 
        **ItemsSource="{Binding Source={StaticResource ScenesXml}}" DisplayMemberPath="@name"**/> 


     <StackPanel> 
       <ListBox Name="LightsList" **ItemsSource="{Binding Source={StaticResource ScenesXml}, XPath=lights/lights-group}**"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <Expander Name="LightsExpander" **Header="{Binding [email protected]}"** > 
           <ListBox> 
            <ListBox.ItemTemplate> 
             <DataTemplate> 
              <StackPanel Orientation="Horizontal"> 
               <Label **Content="{Binding [email protected]}"** /> 
               <CheckBox /> 
              </StackPanel> 
             </DataTemplate> 
            </ListBox.ItemTemplate> 
           </ListBox> 
          </Expander> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </Grid> 
     </StackPanel> 
    </Grid> 

我想:

  • <scenarios-list>加載到組合框中(僅顯示 場景的名稱)[我的代碼已經這樣做]
  • 加載<lights-group>列表到選定的組合框項目列表框中築底(只顯示名稱的燈組的)我的代碼已經這樣做了,即使我得到這個錯誤:

System.Windows.Data Error: 43 : BindingExpression with XPath cannot bind to non-XML object.; XPath='lights/lights-group' BindingExpression:Path=; DataItem='XmlDataCollection' (HashCode=56809051); target element is 'ListBox' (Name='LightsList'); target property is 'ItemsSource' (type 'IEnumerable') XmlDataCollection:'MS.Internal.Data.XmlDataCollection'

  • 內被納入<lights-group>每個擴展器加載所有<lights-item> [我沒有對如何做到這一點微弱的想法]

你能幫助我嗎?

回答

1

我設法讓我tworking與此代碼:

<Grid Name="BaseGrid"> 

    <Grid.Resources> 
     <XmlDataProvider x:Name="ScenesXmlName" x:Key="ScenesXml" XPath="scenari-list/scenario" Source="myPath"/> 
    </Grid.Resources> 

    <ComboBox Grid.Column="0" Grid.Row="1" Name="ScenariCombo" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource ScenesXml}}" DisplayMemberPath="@name"/> 


<StackPanel> 
<ListBox Name="LightsList" ItemsSource="{Binding Source={StaticResource ScenesXml}, XPath=lights/lights-group}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <Expander Header="{Binding [email protected]}" HorizontalAlignment="Stretch"> 
            <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding XPath=lights-item}"> 
             <ListBox.ItemTemplate> 
              <DataTemplate> 
               <Grid> 
                <Grid.ColumnDefinitions> 
                 <ColumnDefinition Width="*" /> 
                 <ColumnDefinition Width="150" /> 
                </Grid.ColumnDefinitions> 
                <Label Content="{Binding [email protected]}" Grid.Column="0"/> 
                <CheckBox Grid.Column="1" IsChecked="{Binding XPath=., Converter={StaticResource myStateToBoolConverter}}"/> 
               </Grid> 
              </DataTemplate> 
             </ListBox.ItemTemplate> 
            </ListBox> 
           </Expander> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
    </StackPanel> 


</Grid> 

所以關鍵似乎IsSynchronized = 「真」。 希望這對其他人有用。

相關問題