从数据集中选择某一行

时间:2010-01-06 20:58:12

标签: c# .net wpf data-binding xpath

我有一个数据集,想要在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 :(得分:0)

如果您输入XPath而不是Path ...

,则会受到支持

答案 1 :(得分:0)

是的,我需要使用XPath,但还有更多内容 我的错误是:
您不能直接使用DataSet,但需要将其包含在XmlDataDocument中 我的问题还涉及命名空间。要压制它们,您必须在创建DataSet.Namespace = String.Empty之前设置XmlDataDocument 如果要使用命名空间,则必须在XAML中创建XmlNamespaceMappingCollection,如此

<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工作,但添加一个约束将导致完全CPU使用,我的程序不能继续:

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

修改 似乎绑定必须处于OneTime模式。只需将其更改为

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

让它发挥作用。我也使用ContentTemplate,在模板中绑定可能是TwoWay,但XPath是原始的(例如./Prozess),也许这就是原因。