C# XmlDataProvider上的绑定错误(无法绑定到非XML对象)

C# XmlDataProvider上的绑定错误(无法绑定到非XML对象),c#,wpf,xml,xmldataprovider,C#,Wpf,Xml,Xmldataprovider,我在将某些控件绑定到XML时遇到问题。 我的应用程序在运行时填充TabControl,并使用DataTemplateSelector加载选项卡的XAML: class TemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { if (item != null) {

我在将某些控件绑定到XML时遇到问题。
我的应用程序在运行时填充TabControl,并使用DataTemplateSelector加载选项卡的XAML:

class TemplateSelector : DataTemplateSelector
{
  public override DataTemplate SelectTemplate(object item, DependencyObject container)
  {
    if (item != null)
    {
      string templateFile = string.Format("Templates/{0}", 
                                          Properties.Settings.Default.AppId + ".tmpl");
      if (File.Exists(templateFile))
      {
        FileStream fs = new FileStream(templateFile, FileMode.Open);
        DataTemplate template = XamlReader.Load(fs) as DataTemplate;

        Tab tab = item as Tab;
        XmlDataProvider xmlDataProvider = template.Resources["dataProvider"] as XmlDataProvider;
        xmlDataProvider.XPath = tab.BridgeObj.XmlFilePath;

        return template;
      }
    }
    return null;
  }
}
XAML:

<DataTemplate
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:EurocomCPS;assembly=EurocomCPS">

  <DataTemplate.Resources>
    <local:StringToBoolConverter x:Key="StrToBoolConverter" />
    <local:StringToIntConverter  x:Key="StrToIntConverter" />
    <XmlDataProvider x:Key="dataProvider" XPath="func/parametri/param/BLOCKS"/>
  </DataTemplate.Resources>

  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Label Grid.Row="0" Grid.Column="0" Content="ITEM 1:"/>
    <Label Grid.Row="1" Grid.Column="0" Content="ITEM 2:"/>
    <Label Grid.Row="2" Grid.Column="0" Content="ITEM 3:"/>

    <TextBox  Name="TextBox1"
              Grid.Row="0" 
              Grid.Column="1" 
              Text="{Binding XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=1]/@value'}" />
    <CheckBox Grid.Row="1" 
              Grid.Column="1"
              IsChecked="{Binding XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=2]/@value',
                            Converter={StaticResource StrToBoolConverter}}"/>

    <CheckBox Grid.Row="2" 
              Grid.Column="1"
              IsChecked="{Binding XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=3]/@value',
                            Converter={StaticResource StrToBoolConverter}}"/>

  </Grid>
</DataTemplate>
---编辑---

我将DataContext添加到控件中,但仍然存在问题。
首先,我得到以下信息:

System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=1]/@value' BindingExpression:Path=/InnerText; DataItem='Tab' (HashCode=46144604); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') Tab:'EurocomCPS.Tab'
System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=1]/@value' BindingExpression:Path=/InnerText; DataItem='Tab' (HashCode=46144604); target element is 'TextBox' (Name='TextBox1'); target property is 'Text' (type 'String') Tab:'EurocomCPS.Tab'
我不明白第一个未定义的“未命名”文本框是什么

第二个是,如果我将转换器放入文本框绑定(例如,像我用于复选框的转换器),我不会得到错误


第三个转换器函数没有被调用。

我认为“@id=1”并不是按照的正确方法。

假设您以某种方式将XML加载到
XmlDataProvider
,因为我看不到任何地方定义的
源代码,您的
XPath
很好,但是您没有为绑定提供
源代码。如果您将其更改为以下内容,它应该可以工作:

<TextBlock Text="{Binding Source={StaticResource dataProvider}, XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=2]/@value'}"/>


如果默认情况下不指定源,它将在
DataContext
中查找

问题在于用于分配XML文件的方法

xmlDataProvider.XPath = tab.BridgeObj.XmlFilePath;
改成

xmlDataProvider.Source = new Uri(tab.BridgeObj.XmlFilePath);

已经解决。

Hi@AstiK,如果我非常确定XPath是有效的,我会尝试不使用“@”,但id不再起作用。Hi@dkozl,非常感谢。你说得对。我将DataContext添加到控件中,但仍有一些问题..我编辑答案以反映这些问题。。
xmlDataProvider.XPath = tab.BridgeObj.XmlFilePath;
xmlDataProvider.Source = new Uri(tab.BridgeObj.XmlFilePath);