高级绑定(先到xml,然后到其他东西)

本文关键字:其他 然后 绑定 先到 xml 高级 | 更新日期: 2023-09-27 18:20:48

首先对标题感到抱歉。我知道这还不太清楚,但我想不出其他什么了。如果有人想让我改变它,请给出你的建议(请注意,否决权不是正确的解决方案),谢谢。现在是我的问题。我有一个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 XPath=@name}"** >
                                <ListBox>
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <Label **Content="{Binding XPath=ligths-item@name}"** />
                                                <CheckBox />
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </Expander>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
        </StackPanel>
    </Grid>

所以基本上我想:

  • <scenarios-list>加载到组合框中(仅显示场景名称)[我的代码已经做到了]
  • <lights-group>列表加载到基于所选组合框项目的列表框中(仅显示灯光组的名称)[即使出现此错误,我的代码也已经执行了此操作:

System.Windows.Data错误:43:具有XPath的BindingExpression无法绑定到非XML对象。;XPath='lights/lights-group'绑定表达式:Path=;DataItem="XmlDataCollection"(哈希代码=56809051);目标元素是"ListBox"(名称="LightsList");目标属性为"ItemsSource"(类型为"IEnumerable")XmlDataCollection:"MS.Internal.Data.XmlDataCollection"

  • 在每个扩展器中加载<lights-group>中包含的所有<lights-item>[我对如何做到这一点一无所知]

你能帮我吗?

高级绑定(先到xml,然后到其他东西)

我成功地使用了以下代码:

<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 XPath=@name}" 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 XPath=@name}" 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="true"。希望这对其他人有用。