我有一个数据集,想要在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应该得到支持,但我不能让它工作。
答案 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
),也许这就是原因。