Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / XPath предыдущее значение в ветке / 8 сообщений из 8, страница 1 из 1
24.09.2015, 08:44
    #39059992
TD6370
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
В данном коде происходит прохождение по всем веткам одного списка. Нужно при обращении к очередному значению в ветке взять значение из предыдущей строки. В данном случае, если в TextBlock с Name="T1" будет значение "3", то в TextBlock с TextBlock c Name="T2" нужно вернуть предыдущее значение "2". Заранее благодарен.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Page.Resources>
        <XmlDataProvider x:Key="DataL">
            <x:XData>
                <Art>
                    <Title>A</Title>
                    <Bars>
                        <Left V="1" />
                        <Left Val="2" />
                        <Left Val="3" />
                    </Bars>
                    <Title>B</Title>
                    <Bars>
                        <Left V="4" />
                        <Left Val="5" />
                        <Left Val="6" />
                    </Bars>
                </Art>
            </x:XData>
        </XmlDataProvider>
        <DataTemplate x:Key="DT">
                <ListBox 
                        ItemsSource="{Binding XPath=Nums/Sample}" 
                        >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                                <TextBlock Name="T1" Text="{Binding XPath=@Val}" />
                                <TextBlock Name="T2" Text="{Binding XPath=@Val}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
        </DataTemplate>
    </Page.Resources>
    <Grid>
        <StackPanel>
            <ListBox
               ItemsSource="{Binding Source={StaticResource DataL}, XPath=Art}"
               ItemTemplate="{StaticResource DT}"/>
        </StackPanel>
    </Grid>
</Page>
...
Рейтинг: 0 / 0
24.09.2015, 09:24
    #39060006
TD6370
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
Код: sql
1.
2.
3.
4.
        <Page.Resources>
            <XmlDataProvider x:Key="DataL">
                <x:XData>
                    <Art>


Опечатка, должно быть:
Код: sql
1.
       <XmlDataProvider x:Key="DT">
...
Рейтинг: 0 / 0
24.09.2015, 09:33
    #39060011
TD6370
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
Еще поправка:
Код: sql
1.
2.
3.
4.
5.
<DataTemplate x:Key="DT">
                <ListBox 
                        ItemsSource="{Binding XPath=Nums/Sample}" 
                        >
                    <ListBox.ItemTemplate>


правильно:
Код: sql
1.
2.
3.
4.
5.
<DataTemplate x:Key="DT">
                <ListBox 
                        ItemsSource="{Binding XPath=Bars/Left}" 
                        >
                    <ListBox.ItemTemplate>
...
Рейтинг: 0 / 0
24.09.2015, 11:27
    #39060126
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
RelativeSource.PreviousData не работает в XPath?
...
Рейтинг: 0 / 0
24.09.2015, 16:06
    #39060490
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
TD6370Еще поправка:
правильно:
Код: sql
1.
2.
3.
4.
5.
<DataTemplate x:Key="DT">
                <ListBox 
                        ItemsSource="{Binding XPath=Bars/Left}" 
                        >
                    <ListBox.ItemTemplate>


TD6370Еще поправка:
правильно:
Код: sql
1.
2.
3.
4.
5.
<DataTemplate x:Key="DT">
                <ListBox 
                        ItemsSource="{Binding XPath=Bars/Left}" 
                        >
                    <ListBox.ItemTemplate>


И у вас будет 2 ресурса с одним ключом? не взлетит, компилятор выдаст ошибку.
Далее, для корневого тэга внутри x:XData документация требует задания пустого неймспейса:
The root node of the XML data has an xmlns attribute that sets the XML namespace to an empty string. This is a requirement for applying XPath queries to a data island that is inline within the XAML page. In this inline case, the XAML, and thus the data island, inherits the System.Windows namespace. Because of this, you need to set the namespace blank to keep XPath queries from being qualified by the System.Windows namespace, which would misdirect the queries.
https://msdn.microsoft.com/en-us/library/system.windows.data.xmldataprovider(v=vs.100).aspx
В разметке вообще что-то странное - ListBox, у которого ItemTemplate - еще один ListBox, у которого, кстати, ItemTemplate написан неправильно - там два одноуровневых элемента (TextBlock) в VisualTree, чего компилятор тоже не пропустит, эти TextBlock'и должны быть завернуты в StackPanel (например).
Примерно вот так будет работать (у меня это работает в обычно окошке - это так, просто для демонстрации):
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
<Window.Resources>
  <XmlDataProvider x:Key="DataL">
    <x:XData>
      <Art xmlns="">
        <Title>A</Title>
        <Bars>
          <Left V="1" />
          <Left Val="2" />
          <Left Val="3" />
        </Bars>
        <Title>B</Title>
        <Bars>
          <Left V="4" />
          <Left Val="5" />
          <Left Val="6" />
        </Bars>
      </Art>
    </x:XData>
  </XmlDataProvider>
</Window.Resources>
<Grid>
  <StackPanel>
    <ListBox
      ItemsSource="{Binding Source={StaticResource DataL}, XPath=/Art/Bars/Left}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBlock Name="T1" Text="{Binding XPath=@Val}" />
            <TextBlock Name="T2" Text="{Binding XPath=preceding-sibling::*[1]/@Val}" Margin="10,0"/>
          </StackPanel>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
  </StackPanel>
</Grid>
...
Рейтинг: 0 / 0
24.09.2015, 16:10
    #39060499
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
я один не пользуюсь XPath и оборачиваю такое в классы, так как XML для меня это слой данных и мне как то стрёмно его связывать напрямую с XML?
...
Рейтинг: 0 / 0
24.09.2015, 16:51
    #39060542
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
Roman Mejtesя один не пользуюсь XPath и оборачиваю такое в классы, так как XML для меня это слой данных и мне как то стрёмно его связывать напрямую с XML?
Иногда (очень иногда) бывают случаи, когда модель для вьюмодели 1) read-only; 2) автогенерируемая. Пример - данные непосредственно из БД (MSSQL) через for xml. Тогда XmlDataProvider вполне удобен. Я именно в таких случаях (пару-тройку раз) к нему и прибегал.
...
Рейтинг: 0 / 0
25.09.2015, 08:53
    #39060847
TD6370
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XPath предыдущее значение в ветке
Сон Веры Павловны,
Код: sql
1.
TextBlock'и должны быть завернуты в StackPanel (например).


Это верно, на коленке писал, забыл вставить контейнер.
А на счет ListBox в ListBox - так задумано.
Спасибо за:
Код: sql
1.
RelativeSource.PreviousData

и
Код: sql
1.
Text="{Binding XPath=preceding-sibling::*[1]/@Val}"


буду пробовать.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / XPath предыдущее значение в ветке / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]