2013-08-26 61 views
1

我在將某些控件綁定到我的XML時遇到問題。
我的應用程序填充在運行時一個TabControl,加載XAML與DataTemplateSelector標籤:XmlDataProvider上的綁定錯誤(無法綁定到非XML對象)

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> 

的每一頁都持有其加載下面的XML文件的XmlDataProvider:

<func id="A29086"> 
    <parametri> 
    <param> 
     <BLOCKS max_count="2" write_id="49" read_req_id="47" read_rep_id="48" session_id="7"> 
     <BLOCK id="1" frame="1" framelen="61"> 
      <ITEMS max_count="14"> 
      <ITEM id="1" type="CHAR" size="1" value="0" /> 
      <ITEM id="2" type="CHAR" size="1" value="1" /> 
      <ITEM id="3" type="CHAR" size="1" value="0" /> 
      ... 
      </ITEMS> 
     </BLOCK> 
     <BLOCK id="2" frame="1" framelen="61"> 
      <ITEMS max_count="14"> 
      <ITEM id="1" type="CHAR" size="1" value="0" /> 
      <ITEM id="2" type="CHAR" size="1" value="1" /> 
      ... 
      </ITEMS> 
     </BLOCK> 
     </BLOCKS> 
    </param> 
    </parametri> 
</func> 

運行時出現此錯誤:

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=57706919); 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=2]/@value' BindingExpression:Path=/InnerText; DataItem='Tab' (HashCode=57706919); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1') Tab:'EurocomCPS.Tab' 
System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='//BLOCK[@id=1]/ITEMS/ITEM[@id=3]/@value' BindingExpression:Path=/InnerText; DataItem='Tab' (HashCode=57706919); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1') Tab:'EurocomCPS.Tab' 

---編輯---

我添加的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' 

而且我不明白什麼是不被任何定義的第一個「無名」文本框。

第二個是,如果我把一個轉換器到TextBox綁定(例如,像我用於CheckBoxes),我不會得到錯誤。

第三個轉換器功能不被調用。

回答

0

假設你以某種方式加載XML爲XmlDataProvider,因爲我沒有看到任何地方Source定義,你XPath是好的,但你不爲你的綁定提供Source。如果您將其更改爲這樣的事情應該工作:

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

,如果你不指定默認源它將在DataContext

+0

嗨@dkozl,非常感謝..你是對的。我添加DataContext到我的控件,但我仍然有一些問題..我編輯我的答案,以反映他們.. – Barzo

0

我認爲'@ id = 1'不是按照blog來做的正確方法。

+0

Hi @AstiK,如果我確信XPath是有效的,我嘗試不使用'@',但id不再工作。 – Barzo

0

問題是用於分配XML文件的方法!

xmlDataProvider.XPath = tab.BridgeObj.XmlFilePath; 

將其更改爲

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

已經解決了。