绑定到XML的WPF DataGrid未更新

绑定到XML的WPF DataGrid未更新,wpf,xml,binding,Wpf,Xml,Binding,我有一个WPF数据网格,它绑定到XML文件中的一些节点 <Settings xmlns=""> <Profiles xmlns="" ActiveProfile="1"> <Profile Id="0" Desc="- none -" Port="0" Baud="0" DataBits="0" Parity="0" StopBits="0" CharDelay="0" ReadTimeout="0" ProcInterval="0" SetInterv

我有一个WPF数据网格,它绑定到XML文件中的一些节点

<Settings xmlns="">
  <Profiles xmlns="" ActiveProfile="1">
    <Profile Id="0" Desc="- none -" Port="0" Baud="0" DataBits="0" Parity="0" StopBits="0" CharDelay="0" ReadTimeout="0" ProcInterval="0" SetInterval="0" DecInterval="0" ChartInterval="0" SaveInterval="0">
      <PIDs>
        <PID Address="1" SetPoint="one" ProcVal="one" />
        <PID Address="2" SetPoint="two" ProcVal="two" />
        <PID Address="3" SetPoint="three" ProcVal="three" />
      </PIDs>
    </Profile>
    <Profile Id="1" Desc="Test Profile 1" Port="1" Baud="19200" DataBits="7" Parity="0" StopBits="3" CharDelay="1" ReadTimeout="100" ProcInterval="100" SetInterval="0" DecInterval="0" ChartInterval="0" SaveInterval="0">
      <PIDs>
        <PID Address="4" SetPoint="four" ProcVal="four" />
        <PID Address="5" SetPoint="five" ProcVal="five" />
        <PID Address="6" SetPoint="six" ProcVal="six" />
      </PIDs>
    </Profile>
当我运行应用程序时,它会正确地显示DataGrid中的项目4、5和6。这是因为ItemsSourceXPath从Profiles节点读取ActiveProfile值,并使用该值选择适当的概要文件节点。即使在设计模式下,DataGrid也会显示这些值

在运行时,我将组合框从第二项索引1更改为第一项索引0。代码在SelectionChanged事件中停止,因此我可以轮询ActiveProfile值,该值正确地从1更改为0,因为ComboBox的绑定模式是双向的。不幸的是,DataGrid没有像它应该显示的那样重新显示项目1、2和3

My Main Window_Closing事件具有保存XML文件(如果XML文件已更改)的代码。如果我这样做,那么下次应用程序运行时,DataGrid值从1、2和3开始。因此绑定正在工作,并从XML文件中选择适当的项列表,但是DataGrid直到下次加载时才更新

我认为XmlDataProvider会自动通知DataGrid进行刷新。我尝试在SelectedIndexChanged事件中执行DataGrid.Items.Refresh,但没有成功


有人知道为什么我的DataGrid不会从XML中刷新吗?谢谢…

这是我自己想出来的。我不知道为什么,但把这个代码:

Private Sub settingsDoc_NodeChanged(sender As Object, e As System.Xml.XmlNodeChangedEventArgs) Handles settingsDoc.NodeChanged

    Dim dp As XmlDataProvider = DirectCast(Me.TryFindResource("PIDData"), XmlDataProvider)
    If dp IsNot Nothing Then
        dp.Document = settingsDoc
    End If

End Sub
似乎解决了这个问题。它不应该是必需的,因为setingsdoc和XmlDataProvider.Document都反映了执行此代码之前的正确值。出于某种原因,上面的代码强制DataGrid刷新

Private settingsDoc As XmlDocument
Private dp As XmlDataProvider

Private Sub MainWindow_Initialized(sender As Object, e As System.EventArgs) Handles Me.Initialized

    dp = Me.TryFindResource("MySettings")
    If dp IsNot Nothing Then
        settingsDoc = dp.Document
        settingsText = settingsDoc.OuterXml
    End If

End Sub

Private Sub cboProfile_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles cboProfile.SelectionChanged

    If Me.dgPIDData IsNot Nothing Then
        If dp IsNot Nothing Then
            Stop
        End If
    End If

End Sub
Private Sub settingsDoc_NodeChanged(sender As Object, e As System.Xml.XmlNodeChangedEventArgs) Handles settingsDoc.NodeChanged

    Dim dp As XmlDataProvider = DirectCast(Me.TryFindResource("PIDData"), XmlDataProvider)
    If dp IsNot Nothing Then
        dp.Document = settingsDoc
    End If

End Sub