2011-07-19 23 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