我有一个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从“个人档案”节点读取“ActiveProfile”值,并使用它来选择正确的“个人档案”节点。即使在设计模式下,DataGrid也会显示这些值。
在运行时,我将ComboBox从第二个项目(索引1)更改为第一个项目(索引0)。代码在SelectionChanged事件中停止,因此我可以轮询“ActiveProfile”值,该值从“1”正确变为“0”,因为ComboBox的绑定模式是TwoWay。不幸的是,DataGrid不会像它应该的那样重新显示第1,2和3项。
我的MainWindow_Closing事件包含用于保存XML文件(如果已更改)的代码。如果我这样做,那么下次运行应用程序时,DataGrid值从1,2和3开始。因此绑定正在工作,并从XML文件中选择正确的项列表,但DataGrid直到下次加载时。
我认为XmlDataProvider会自动通知DataGrid进行刷新。我尝试在SelectedIndexChanged事件中执行DataGrid.Items.Refresh(),但没有运气。
有没有人知道为什么我的DataGrid不会从XML刷新?感谢...
答案 0 :(得分:0)
自己想出来。我不知道为什么,但是把这段代码:
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刷新。