【问题标题】:no data, no exception when loading XML Data into WPF DataGrid没有数据,将 XML 数据加载到 WPF DataGrid 时也不例外
【发布时间】:2017-10-15 22:58:54
【问题描述】:

在我的 WPF 应用程序中应该可以:

读取 XML 数据并将它们呈现在用户界面中。

为此,我在 MainPage.xaml 文件中定义了一个 dataGrid:

<DataGrid Name="dataGrid" AutoGenerateColumns="True" />

在代码隐藏文件中,我创建了一个方法,用 xml 文件中的数据填充这个数据网格:

private void mnuOpen_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
    Nullable<bool> result = dlg.ShowDialog();
    if (result == true)
     {
         string path = System.IO.Path.GetFullPath(dlg.FileName);
         var xml = XDocument.Load(path).Root;
         dataGrid.DataContext = xml;
     }
}

这可以正常编译,也可以正常运行(不会引发异常)——但是,xml 数据不会显示在 UI 中。

在使用调试器的时候,有几个奇怪的地方:

  1. 监视窗口中的变量“path”始终如下所示:path error CS0103: The name 'path' does not exist in the current context

  2. 出于某种原因,一行

var xml = XDocument.Load(path).Root;

似乎被“跳过”了。也就是调试器直接从

string path = System.IO.Path.GetFullPath(dlg.FileName);

dataGrid.DataContext = xml;

我真的不明白这里发生了什么。

【问题讨论】:

  • “跳过”没有意义。导致尝试通过设置 DataContext 来填充 DataGrid 的决策过程是什么?
  • 我使用了以下链接下的建议:stackoverflow.com/questions/5238534/c-wpf-datagrid-and-xml-file ... 请参阅已批准答案中的“代码隐藏”部分
  • 你能在你的代码中识别出XmlDataProvider的实例吗?
  • 我以为您使用 XmlDataProvider 或“代码隐藏”方法...我没有 XMLDataProvider 的实例
  • 您使用了代码隐藏方法,所以幸运的是,您避免了尝试使 XmlDataProvider 工作的恐惧。

标签: c# xml visual-studio xaml datagrid


【解决方案1】:

由于您没有使用XmlDataProvider,因此使用该方法的一两个片段来解决问题并忽略其余部分不会有太多收获。 XmlDataProvider 很奇怪,任何涉及它的东西都将成为一种解决方法。

在 WPF 中,您可以通过设置或绑定 ItemsSource 来填充 DataGrid 或任何“收集控件”(ListBoxComboBox 等)。这就是用集合填充这些东西的属性。您看到的答案只是在使用 XmlDataProvider 时启用绑定 ItemsSource 的丑陋解决方法。 DataContext 是任何 WPF 控件都具有的更通用的属性。它是绑定用来查找您绑定到的属性的。你没有绑定任何东西,所以稍后再担心。

由于您在代码隐藏中执行此操作,因此速度很快,并且可以与我在此答案底部包含的示例 XML 一起使用:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
    Nullable<bool> result = dlg.ShowDialog();
    if (result == true)
    {
        string path = System.IO.Path.GetFullPath(dlg.FileName);

        DataSet dataSet = new DataSet();
        dataSet.ReadXml(path);
        DataView dataView = new DataView(dataSet.Tables[0]);
        dataGrid.ItemsSource = dataView;
    }
}

我可能会从 XML 创建 POCO 对象并在视图模型的集合中公开这些对象,或者如果我非常着急,我可能会让视图模型像上面那样公开 DataView。但是,如果您还没有在这个项目中使用 MVVM,那么您不妨将其留给下一个项目。

XML:

<Items>
  <Item Foo="0" Bar="A" />
  <Item Foo="1" Bar="B" />
  <Item Foo="2" Bar="C" />
  <Item Foo="3" Bar="D" />
</Items>

这也有效:

<Items>
  <Item>
    <Foo>0</Foo>
    <Bar>A</Bar>
  </Item>
  <Item>
    <Foo>1</Foo>
    <Bar>B</Bar>
  </Item>
</Items>

【讨论】:

  • 现在,使用此代码,我收到以下错误消息:“System.IndexOutOfRangeException occurred Message=Table 0 cannot be found.”
  • @Tommy 我能看到引发该异常的确切代码吗?
  • 当然,我可以将全部内容发送给您...... MainPage.xaml.c 文件中只有大约 100 行代码
  • 不发送,只发帖。我怀疑我是否需要任何不涉及 XML 和/或 DataGrid 的东西。问题没有大小限制,只需在更新上方连续粘贴四个破折号,markdown 将创建一个水平条。
  • 您可以忘记第一种方法(适用于文本文件并且工作正常)...不起作用的方法是:mnuOpen2_Click
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多