2011-07-19 28 views
0

我有一个ListView绑定到一个XML文件(简单的日志文件)。WPF - ListView xml Bindign只能工作一次

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

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

为什么?

回答

1

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

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

+0

哦,谢谢。奇怪..我不明白为什么如果我关闭一个窗口ItemSource保持设置..任何方式:我如何重置ItemSource? – Rick

+0

通过'重置'ItemsSource/DataContext你的意思是'重新分配'?有另一种方法吗? – epalm

0

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

我有一个ListView绑定到一个XML文件(一个简单的日志文件)。

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

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

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

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

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

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

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

+0

mmmh ...现在我明白了。实际上,我已将ItemSource绑定到了app.xaml中定义的XmlDataProvider。我试图在child win的XAML中定义xmldatasource,但我用作资源/内容的文件存在问题。看看这里http://stackoverflow.com/questions/6416918/wpf-bind-a-listview-to-a-xml-file-dynamically – Rick