【发布时间】:2009-11-11 07:53:04
【问题描述】:
这是我目前所做的:
-
在我的
App类中,我声明了一个新的XmlDataProvider并将源设置为有效的 XML 文件(其 Build Action 设置为 Content/Copy Always)。public partial class App : Application { public App() { InitializeComponent(); var services = new XmlDataProvider(); services.Source = new Uri("pack://siteoforigin:,,,/Data/Services.xml"); // also tried an absolute path, but that made no difference var mainWindow = new MainWindow(); mainWindow.DataContext = new MainViewModel(services); mainWindow.Show(); } } XmlDataProvider被传递到 ViewModel 并被分配给Services属性。-
我像这样绑定到数据:
<mwc:DataGrid ItemsSource="{Binding Services, XPath=//Services/*}"> <mwc:DataGrid.Columns> <mwc:DataGridTextColumn Binding="{Binding XPath=@name}" Header="Name" /> <mwc:DataGridTextColumn ... /> ... </mwc:DataGrid.Columns> </mwc:DataGrid>
结果:
我的DataGrid 的列标题出现了,但是没有数据行。它编译并运行没有任何错误,但如果我检查我的输出窗口,我会看到:
BindingExpression with XPath cannot bind to non-XML object.;
XPath='//Services/*'
BindingExpression:Path=Services;
XmlDataProvider 只能以声明方式使用吗?
如果我尝试像这样在 ResourceDictionary 中以声明方式创建 XmlDataProvider...
<XmlDataProvider
x:Key="Main_Services">
<x:XData>
<Services
xmlns="">
<Service
name="Test"
... />
<Service ... />
...
</Services>
</x:XData>
</XmlDataProvider>
...一切正常(我在DataGrid 中得到了预期的行)。 (请注意,我只是将 XML 文件的内容粘贴在 <x:XData> 标记之间。)
如果我尝试通过 C# 设置 Source,但是,XmlDataProvider 中似乎没有任何数据(字面意思是,Data 属性为空)。
在分配Source 时,使用“pack URI”还是绝对路径似乎没有任何区别。无论哪种方式,我都没有行。我也试过在设置源之后调用InitialLoad()方法,但也没有什么区别。
问题:
- 是 XmlDataProvider 只是错误的工具,还是我做错了什么?
- 只能以声明方式使用 XmlDataProvider 吗?
- 我知道有
XDocument和XmlDocument...我应该使用其中之一吗?
【问题讨论】: