Связывание WPF XPath с несколькими результатами, преобразованными в строку с разделителями-запятыми - PullRequest
4 голосов
/ 26 октября 2009

У меня есть XML-файл, похожий по структуре на следующий:

<Parent><br> <Child>5</Child><br> <Child>3</Child><br> <Child>5</Child><br> <Child>1</Child><br> </Parent>

В моем XAML у меня есть ListView, связанный с файлом XML, и я установил DataTemplate объекта ListViewItem следующим образом:

<TextBlock Text="{Binding XPath=Parent/Child}"/>

Очевидно, я ожидаю 4 результата для этого запроса XPath, но я не могу найти способ преобразовать результаты в строку, разделенную запятыми, и сейчас TextBlock просто отображает первое значение.

Если я использую тот же запрос XPath для установки ItemsSource для ListBox, я получаю все результаты в ListBox, поэтому я думаю, что я смогу получить все значения, передаваемые в класс Converter ...

Ответы [ 2 ]

1 голос
/ 26 октября 2009

Нет способа получить запрос XPath, который возвращает несколько узлов, таких как ваш, объединить их в одно значение для вас. Происходит то, что возвращается набор узлов, и, поскольку вы привязываетесь к одному строковому свойству, инфраструктура просто приводит этот набор узлов в действие, захватывая первый узел из набора и затем захватывая его узел @text.

Честно говоря, я не пробовал это сам и у меня нет времени в данный момент, но я ожидаю, что это сработает только в том случае, если вы написали собственный IValueConverter. Я предполагаю, что он передаст XmlNodeList в качестве значения для преобразования, а затем вы можете перечислить эти узлы и объединить строку через запятую самостоятельно.

Обновление

Так как предложение IValueConverter не сработало из-за того, что механизм XPath выполняет предварительное приведение, я предлагаю вам сделать следующее: вместо привязки к одному TextBlock вместо этого привязывайте к ItemsControl и определяйте ItemTemplate для ItemsControl, следующим образом:

<DataTemplate>
    <TextBlock Text="{Binding}"/>,
</DataTemplate>

Примечание: Честно говоря, я использую ленивый подход в DataTemplate, и вы получите запятую даже после последнего элемента прямо сейчас. Тем не менее, вы должны быть в состоянии определить DataTemplate с триггером, который определяет, что это последний элемент и не показывает запятую.

Наконец, в зависимости от того, как вы хотите расположить данные, также установите ItemsPontel ItemsControl. Я предполагаю, что вы хотите горизонтальный поток с переносом здесь:

<ItemsPanelTemplate>
    <WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
0 голосов
/ 26 октября 2009

Если вы хотите установить данные XML в качестве источника для вашего ListView, вы можете сделать это следующим образом:

MyListView.ItemsSource = XElement.Load(@"XMLFile1.xml").Elements("Child");

и вы привязываетесь к свойству Value в TextBlock:

<TextBlock Text="{Binding Path=Value}" />

Если вам нужно изменить запрос, вы можете извлечь содержимое вашего XML-файла в переменную, которую вы можете использовать в качестве ItemsSource в ListView.

XElement xmlData = XElement.Load(@"XMLFile1.xml");
var query = from x in xmlData.Elements("Child")
            select x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...