需要帮助将XML文件连接到WPF DataGrid

时间:2009-11-11 07:53:04

标签: c# wpf xml xaml mvvm

以下是我到目前为止所做的事情:

  1. 在我的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();
        }
    }
    
  2. XmlDataProvider传递到ViewModel并被分配到Services属性。

  3. 我绑定到这样的数据:

    <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>
    
  4. 结果:

    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#设置SourceXmlDataProvider中似乎没有任何数据(字面意思是Data属性为空)。< / p>

    在分配Source时,我是否使用“pack URI”或绝对路径似乎没有任何区别。无论如何我都没有排。我也尝试在设置源代码后调用InitialLoad()方法,但这也没有区别。

    问题:

    • XmlDataProvider只是错误的工作工具还是我做错了什么?
    • 只能以声明方式使用XmlDataProvider吗?
    • 我知道有XDocumentXmlDocument ...我应该使用其中一个吗?

1 个答案:

答案 0 :(得分:1)

陈述似乎是要走的路。此代码有效:

<XmlDataProvider
    x:Key="Main_Services"
    Source="pack://siteoforigin:,,,/Data/Services.xml">
</XmlDataProvider>

我不知道为什么在C#中做同样的事情会失败,但我可以忍受这个解决方案。