C# XmlDataProvider上的绑定错误(无法绑定到非XML对象)
我在将某些控件绑定到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) {
我的应用程序在运行时填充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);