@murad88

Как создать XPath запрос для Polyline.Points?

Помогите составить XPath запрос, уже как день не могу это сделать.
Есть XML
<Root>
  <Chart>
    <Title>График 1</Title>
    <Points Color="Black">
      <Point Value="1 1 10 10"/>
      <Point Value="2 2 20 20"/>
      <Point Value="3 3"/>
    </Points>
  </Chart>

  <Chart>
    <Title>График 2</Title>
    <Points Color="Green">
      <Point Value="1 1 10 10"/>
      <Point Value="2 2 20 20"/>
      <Point Value="3 3"/>
    </Points>
  </Chart>
</Root>

Нужно сделать запрос который вернет все Point и на основе них построить график.
Я делаю вот так, но в Polyline.Points попадает только первый Point (1 1 10 10) и поэтому в каждом графике рисуется только одна прямая линия.
<Polyline Points="{Binding XPath=//Root/Chart/Points/Point/@Value}" />

Как сделать так чтоб в график попали все Point, а не только первый ?
  • Вопрос задан
  • 330 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
К сожалению, забиндить XPath-запрос, возвращающий несколько узлов, на какое-либо свойство типа, не имеющего отношения к XML-структуре документа (например, на свойство типа string) невозможно, т.к. это потребует агрегации этого множества узлов в единственное значение (строку), а как делать эту агрегацию в общем случае - непонятно. Т.е. неясно, как собрать ОДНУ строку из нескольких значений атрибутов Value.
Могу порекомендовать вам два пути:
1) превратить ВСЕ содержимое узла Points в одну строку. Вот работающий вариант:
<Window x:Class="PolygonTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <XmlDataProvider x:Key="ChartData">
            <x:XData>
                <Root xmlns="">
                    <Chart>
                        <Title>График 1</Title>
                        <Points Color="Black">
                            1,1 10,10
                            40,30 20,20
                            15,87
                        </Points>
                    </Chart>
                </Root>
            </x:XData>
		</XmlDataProvider>
	</Window.Resources>
    <Grid Name="grid" DataContext="{Binding Source={StaticResource ChartData}}">
        <Polygon Name="polygon" Points="{Binding XPath=/Root/Chart[1]/Points}" Stroke="#FFD33D3D" />
    </Grid>
</Window>


2) обработать XML вручную, в обход WPF и каких-либо привязок, во viewmodel-и самому собрать нормальную PointCollection, выставить эту коллекцию как свойство и забиндиться к нему из полигона обычным биндингом

Вот обсуждение проблемы на SO, похоже ваш случай, только проще. В ответе пишут, что не помогает даже попытка применить конвертер, так как множество узлов обрезается до самого первого сразу же.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ar4ebaldello
Вы пытались "Root/Chart/Points/Point/@Value" заменить на "Root/Chart/Points/@Value"?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы