Расширенное связывание (сначала в xml, затем в другое) - PullRequest
0 голосов
/ 20 января 2012

прежде всего извините за заголовок. Я знаю, что это не так ясно, но я не могу думать ни о чем другом. Если кто-то хочет, чтобы я изменил его, дайте свои предложения, пожалуйста (и обратите внимание, что снижение голосов здесь не является правильным решением) Теперь моя проблема. У меня есть 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>

У меня есть usercontrol, в котором пользователь может видеть и редактировать следующие сценарии:

<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: BindingExpression с XPath не может связываться с не-XML объектом; XPath = 'lights / lights-group' BindingExpression: Path =; DataItem = 'XmlDataCollection' (HashCode = 56809051); целевым элементом является ListBox (Name = 'LightsList'); Свойство target - «ItemsSource» (тип «IEnumerable»). XmlDataCollection: «MS.Internal.Data.XmlDataCollection»

  • внутри каждого Расширителя загружают все <lights-item>, которые входят в <lights-group> [У меня нет ни малейшего представления о том, как это сделать]

Можете ли вы помочь мне, пожалуйста?

1 Ответ

1 голос
/ 10 февраля 2012

Мне удалось получить этот код:

<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". Надеюсь, что это полезно для других людей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...