WPF DataGrid 绑定到 XML 未更新

Posted

技术标签:

【中文标题】WPF DataGrid 绑定到 XML 未更新【英文标题】:WPF DataGrid Bound to XML not Updating 【发布时间】:2013-06-01 10:47:28 【问题描述】:

我有一个 WPF DataGrid,它绑定到我的 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>

这里是一些相关的 XAML:

<XmlDataProvider x:Name="MySettings" x:Key="MySettings" Source="Settings.xml" XPath="Settings" IsAsynchronous="False" IsInitialLoadEnabled="True"/>
<XmlDataProvider x:Name="PIDData" x:Key="PIDData" Source ="Settings.xml" XPath="Settings/Profiles"/>

<ComboBox Name="cboProfile" Width="150" Padding="10,3,4,3" ItemsSource="Binding Source=StaticResource MySettings, XPath=Profiles/Profile"
          SelectedValuePath="@Id" DisplayMemberPath="@Desc"
          SelectedValue="Binding Mode=TwoWay, Source=StaticResource MySettings, XPath=Profiles/@ActiveProfile"/>

<DataGrid Name="dgPIDData" AutoGenerateColumns="False" Height="201" HorizontalAlignment="Left" Margin="233,137,0,0" VerticalAlignment="Top" Width="444"
          DataContext="Binding Source=StaticResource PIDData" ItemsSource="Binding XPath=Profile[@Id\=../@ActiveProfile]/PIDs/PID">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Address" Binding="Binding XPath=@Address"/>
        <DataGridTextColumn Header="Set Point" Binding="Binding XPath=@SetPoint"/>
        <DataGridTextColumn Header="Proc Val" Binding="Binding XPath=@ProcVal"/>
    </DataGrid.Columns>
</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

当我运行该应用程序时,它会在 DataGrid 中正确显示项目 4、5 和 6。这是因为 ItemsSource XPath 从 Profiles 节点读取“ActiveProfile”值,并使用它来选择正确的 Profile 节点。即使在设计模式下,DataGrid 也会显示这些值。

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

如果 XML 文件已更改,我的 MainWindow_Closing 事件具有保存 XML 文件的代码。如果我这样做,那么下次应用程序运行时,DataGrid 值从 1、2 和 3 开始。所以绑定正在工作,并从 XML 文件中选择正确的项目列表,但 DataGrid 只是不更新​​,直到下次加载时。

我以为 XmlDataProvider 会自动通知 DataGrid 刷新。我尝试在 SelectedIndexChanged 事件中执行 DataGrid.Items.Refresh(),但没有运气。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于WPF DataGrid 绑定到 XML 未更新的主要内容,如果未能解决你的问题,请参考以下文章

刷新 WPF Datagrid 未绑定到可观察集合?

如何自动更新 WPF DataGrid 和 xml 之间的绑定

WPF DataGrid 绑定数据及时更新的处理

WPF Datagrid Combobox SelectedItem 未正确绑定到 Powershell 对象

在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid

WPF DataGrid - 如何暂停数据绑定中的 UI 更新并稍后进行批量更新