积极答复者
如何使wpf程序运行时实时显示xml(硬盘上的文件)的内容?

问题
-
我想在程序运行时实时显示硬盘上的xml的内容,例如用textblock 显示传感器采集得到的xml数据
我将xml作为xmldataprovider,将textblock.text 和xml内的数据进行了绑定
现在遇到的问题是程序在运行开始时读取了xml内的数据,运行时xml数据改变了,但程序内的显示未发生改变。
我看到在回答问题 “实现xml和xaml数据双向绑定的问题”时 版主提到了“在运行时,我们对XML数据的任何更改都是在内存中进行的,也就是说这个是临时的,这个更改结果是临时反映在内存中的,如果我们不手动保存到本地硬盘的话,程序一退出,所有的改动都不会自动保存(即使你设置了TwoWay binding).”
我遇到的情况也是这个原因吗? 应该怎么解决呢?
答案
-
参考下我刚写的例子,你运行后,手动更改输出目录中的 People.xml的内容,比如将 age 从20改到30,你会发现WPF程序中的邦定也会相应变化:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2011/20110329%5E_FileSystemNotifyWPFXMLBinding.zip
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已建议为答案 Jie BaoModerator 2011年3月29日 9:49
- 已标记为答案 vslionheart 2011年3月30日 4:53
全部回复
-
例如
我想让textblock实时显示xml内num的数值,应该如何修改代码?
硬盘上有个xml
<?xml version="1.0" encoding="gb2312"?>
<num>0</num>
程序的xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication25.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480"><Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource data}}" >
<TextBlock x:Name="num" Text="{Binding Mode=OneWay, XPath=/num}" />
</Grid>
</Window>app.xaml内
<XmlDataProvider x:Key="data" Source="E:\00.xml"/>
-
OK, 这里有一个关键点,就是本身你的邦定是没有问题的,但是文件系统中的这个XML文件被改变了,WPF没有收到任何通知说文件数据被改变,所以说帮定没有被更新。当然,我也可以很直接的告诉你,WPF确实是不会知道某个xml文件什么时候被改变的,它只是在创建这个实例的时候将文件读入,然后将数据邦定。 所以,归纳起来,我们要解决的问题是如何让WPF知道某个文件被改变。
在.Net中,有一个类可以做到监测文件系统的变化:FileSystemWatcher 类,我们可以通过指定一个路径,让这个类的实例去监测这个路径,看里面是否有文件被改变,包括增加删除修改等。然后就可以通过相应的事件来通知我们的WPF程序去重新创建一个 XmlDocument 或者 XDocument 来读取这个改后的XML文件。最终实现邦定更新 (使用XmlDocument 或者 XDocument ,取决于你是使用 XmlDataProvider还是XLinq的模式在WPF里面做邦定,这两种模式,你可以参考下这篇博客:http://bea.stollnitz.com/blog/?p=50)。
关于FileSystemWatcher的例子,你可以看下下面的:http://www.builder.com.cn/2007/0319/382093.shtml
Sincerely,
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已建议为答案 Jie BaoModerator 2011年3月29日 9:49
-
-
"WPF中实现Timer 事件 " 也行, 在WPF里面使用 DispatcherTimer。
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
-
参考下我刚写的例子,你运行后,手动更改输出目录中的 People.xml的内容,比如将 age 从20改到30,你会发现WPF程序中的邦定也会相应变化:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2011/20110329%5E_FileSystemNotifyWPFXMLBinding.zip
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
- 已建议为答案 Jie BaoModerator 2011年3月29日 9:49
- 已标记为答案 vslionheart 2011年3月30日 4:53
-
用Timer当然可以,你隔一段时间检测文件是否变化,变化了就执行Xml.Refresh()。
但是检测是否变化还是比较复杂的(如果文件是从Web上更新的还好)。
Sheldon _Xiao[MSFT]
MSDN Community Support | Feedback to us
Get or Request Code Sample from Microsoft
Please remember to mark the replies as answers if they help and unmark them if they provide no help.