以下是我到目前为止所做的事情:
在我的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只能以声明方式使用吗?
如果我尝试在XmlDataProvider
这样声明地创建ResourceDictionary
......
<XmlDataProvider
x:Key="Main_Services">
<x:XData>
<Services
xmlns="">
<Service
name="Test"
... />
<Service ... />
...
</Services>
</x:XData>
</XmlDataProvider>
...一切正常(我在DataGrid
中得到了预期的行)。 (请注意,我只是在<x:XData>
标记之间粘贴了XML文件的内容。)
但是,如果我尝试通过C#设置Source
,XmlDataProvider
中似乎没有任何数据(字面意思是Data
属性为空)。< / p>
在分配Source
时,我是否使用“pack URI”或绝对路径似乎没有任何区别。无论如何我都没有排。我也尝试在设置源代码后调用InitialLoad()
方法,但这也没有区别。
问题:
XDocument
和XmlDocument
...我应该使用其中一个吗?答案 0 :(得分:1)
陈述似乎是要走的路。此代码有效:
<XmlDataProvider
x:Key="Main_Services"
Source="pack://siteoforigin:,,,/Data/Services.xml">
</XmlDataProvider>
我不知道为什么在C#中做同样的事情会失败,但我可以忍受这个解决方案。