WPF - ListView xml绑定只能工作一次

时间:2011-07-19 17:23:55

标签: wpf xml listview

我有一个ListView Binded到一个xml文件(一个简单的日志文件)。

此列表视图位于项目的辅助对话框窗口中。

当我第一次打开窗口时,它会在列表视图中正确显示信息。然后,如果我关闭此窗口并执行某些操作,我的xml文件会更改。如果现在我重新打开包含xml文件的对话框窗口,它会显示最后一个状态(信息显示我打开窗口的第一个时间),而不是更新的整个状态。

为什么?

2 个答案:

答案 0 :(得分:1)

XML不会触发WPF数据绑定依赖的INotifyPropertyChanged事件,以了解项目何时更改并需要重新绑定。每次打开对话框窗口时,都可能需要显式设置ItemsSource或DataContext。

此外,XML对象不检测文件更改。如果您依赖外部事件(系统日志?)来创建新的XML节点,则可能需要重新加载XML。

答案 1 :(得分:0)

很难准确说出什么能解决您的问题,因为您的描述不准确。你说:

  

我有一个ListView Binded到一个xml文件(一个简单的日志文件)。

这实际上是不可能的。您无法绑定ListView,只绑定ItemsSource。并且您不能绑定到XML文件,而只能绑定到包含从XML文件读取的数据的内存中的对象。这听起来像是在挑选尼特,但我不是:你越清楚地描述你实际在做什么,就越容易为你提供一个可用的答案。

听起来好像您可能在XAML中定义XmlDataProvider,其Source设置为XML文件的名称。如果在主窗口中将其设置为资源,则在加载主窗口时将加载它。如果您的子窗口有类似

的内容
<ListView ItemsSource="{StaticResource MyXmlDocument}" .../>

它将使用资源字典的XmlDataProvider方法查找Find,并在主窗口的资源字典中找到它。您可以整天关闭并重新打开子窗口,它使用的XmlDataProvider不会更改。

如果是这种情况,您可能需要的是两件事之一。

首先,您可以将XmlDataProvider资源的定义移动到子窗口的XAML。这将强制子窗口在每次加载子窗口时重新加载XML。

其次,您可以向主窗口添加一个方法,只要XML文件在磁盘上发生更改,就会重新创建XmlDataProvider。 (您如何知道XML文件何时更改,以及如何在主窗口中触发该方法,是相对棘手的问题 - 例如,您可以使用FileSystemWatcher事件。)您需要使用{ {1}}您的子窗口中的标记扩展XAML(如果这样做。)这将在每次XML文件更改时刷新子窗口 - 即使它已经打开。