Выбор определенной строки из набора данных - PullRequest
0 голосов
/ 06 января 2010

У меня есть набор данных, и я хочу отобразить содержащие строки в WPF-Contorl. Проблема в том, что управление является своего рода принципиальной схемой. Таким образом, я создал шаблон для отображения значений и поместил несколько его экземпляров в мою схему управления. В настоящее время XAML-код в схеме выглядит так:

<Label Content="{Binding Path=.[0]}" ContentTemplate="{StaticResource ValueTpl}" />
<Label Content="{Binding Path=.[1]}" ContentTemplate="{StaticResource ValueTpl}" />

И так далее. Таким образом, я могу показать n-й ряд в указанной позиции. Проблема в том, что я не могу больше ожидать правильного порядка, и мне бы хотелось что-то вроде:

<Label Content="{Binding Path=.[id=5]}" ContentTemplate="{StaticResource ValueTpl}" />
<Label Content="{Binding Path=.[id=8]}" ContentTemplate="{StaticResource ValueTpl}" />

Я прочитал, что XPath должен поддерживаться, но я не могу заставить это работать.

Ответы [ 2 ]

0 голосов
/ 07 января 2010

Да, мне нужно использовать XPath, но это еще не все.
Мои ошибки были:
Вы не можете использовать DataSet напрямую, но нужно обернуть его в XmlDataDocument
Также моя проблема связана с пространствами имен. Чтобы подавить их, вы должны установить DataSet.Namespace = String.Empty до создания XmlDataDocument.
Если вы хотите использовать пространства имен, вам нужно создать XmlNamespaceMappingCollection в XAML, как это

<UserControl.Resources>
    <XmlNamespaceMappingCollection x:Key="namespace">
        <XmlNamespaceMapping Prefix="ds" Uri="http://tempuri.org/DataSet.xsd" />
    </XmlNamespaceMappingCollection>
</UserControl.Resources>

Для ссылки на пространство имен в XPath. Простое добавление его как xmlns не сработает (в отличие от того, что я ожидал).
Тогда ссылка на определенную строку работала так:

<Label Content="{Binding XPath='//TableName[4]'}" />

Если вы используете пространства имен, вам нужно сослаться на XmlNamespaceManager

<Label Content="{Binding XPath='//ds:TableName[4]'}" Binding.XmlNamespaceManager="{StaticResource namespace}" />

Теперь, когда этот очень простой XPath работает, добавление ограничения приведет к полной загрузке ЦП, и моя программа не будет продолжаться:

<Label Content="{Binding XPath='//TableName[Process = 4]'}" />
or
<Label Content="{Binding XPath='//ds:TableName[ds:Process = 4]'}" Binding.XmlNamespaceManager="{StaticResource namespace}" />

EDIT Похоже, что привязка должна быть в режиме OneTime. Просто изменив его на

<Label Content="{Binding Mode=OneTime, XPath='//TableName[Process = 4]'}" />

заставил это работать. Я также использую ContentTemplate и в шаблоне привязка может быть TwoWay, но там XPath примитивен (например, ./Prozess), может быть, поэтому.

0 голосов
/ 07 января 2010

Поддерживается, если вы набираете XPath вместо Path ...

...