【问题标题】:Need help hooking up XML file to WPF DataGrid需要帮助将 XML 文件连接到 WPF DataGrid
【发布时间】:2009-11-11 07:53:04
【问题描述】:

这是我目前所做的:

  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>
    

结果:

我的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 文件的内容粘贴在 &lt;x:XData&gt; 标记之间。)

如果我尝试通过 C# 设置 Source,但是,XmlDataProvider 中似乎没有任何数据(字面意思是,Data 属性为空)。

在分配Source 时,使用“pack URI”还是绝对路径似乎没有任何区别。无论哪种方式,我都没有行。我也试过在设置源之后调用InitialLoad()方法,但也没有什么区别。

问题:

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

【问题讨论】:

    标签: c# wpf xml xaml mvvm


    【解决方案1】:

    声明式似乎是要走的路。此代码有效:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多