我在將某些控件綁定到我的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),我不會得到錯誤。
第三個轉換器功能不被調用。
嗨@dkozl,非常感謝..你是對的。我添加DataContext到我的控件,但我仍然有一些問題..我編輯我的答案,以反映他們.. – Barzo