我有一个ListView Binded到一个xml文件(一个简单的日志文件)。
此列表视图位于项目的辅助对话框窗口中。
当我第一次打开窗口时,它会在列表视图中正确显示信息。然后,如果我关闭此窗口并执行某些操作,我的xml文件会更改。如果现在我重新打开包含xml文件的对话框窗口,它会显示最后一个状态(信息显示我打开窗口的第一个时间),而不是更新的整个状态。
为什么?
答案 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文件更改时刷新子窗口 - 即使它已经打开。