2011-07-19 23 views
0

私はListViewをXMLファイル(単純なログファイル)にバインドしています。WPF - ListView xml Bindignは一度しか動作しません。

このリストビューは、私のプロジェクトのセカンダリダイアログウィンドウにあります。

初めてウィンドウを開くと、リストビューの情報が正しく表示されます。次に、このウィンドウを閉じて何かすると、XMLファイルが変更されます。今、xmlファイルを含むダイアログウィンドウを再度開くと、最後のステータスが表示されます(情報には、ウィンドウを開いた前の時間が表示されます)。

なぜですか?

答えて

1

WPFデータバインドで項目が変更され、再バインドする必要があることを知るために必要なINotifyPropertyChangedイベントは、XMLによってトリガーされません。ダイアログウィンドウを開くたびに明示的にItemsSourceまたはDataContextを設定することができます。

また、XMLオブジェクトはファイルの変更を検出しません。外部イベント(システムログ?)に頼って新しいXMLノードを作成する場合は、XMLをリロードする必要があります。

+0

ありがとうございます。奇妙な。私はなぜItemSourceが設定されたままになっているウィンドウを閉じると理解していない。何とか:ItemSourceをリセットするにはどうすればいいですか? – Rick

+0

'リセット' ItemsSource/DataContext '再割り当て'を意味しますか?別の方法がありますか? – epalm

0

説明が不正確であるため、問題を解決するものを正確に伝えるのは難しいです。あなたは言う:

私はXMLファイル(単純なログファイル)にバインドされたListViewを持っている。

これは実際には可能ではありません。 ListViewはバインドできません。ItemsSourceのみバインドできません。また、XMLファイルにバインドすることはできませんが、XMLファイルから読み取ったデータを含むメモリ内のオブジェクトにのみバインドすることができます。これは私がニットを選んでいるように聞こえますが、私はそうではありません。実際に何をしているのかが明確になればなるほど、使いやすい答えを提供するのが簡単になります。

XmlDataProviderをXAMLに定義しているように見えますが、そのSourceをXMLファイルの名前に設定します。これをメインウィンドウのリソースとして設定すると、メインウィンドウがロードされたときにロードされます。あなたの子ウィンドウが

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

のようなものを持っている場合には、リソースディクショナリのFindメソッドを使用してXmlDataProviderを検索し、メインウィンドウのリソースディクショナリにそれを見つけるために起こっています。子ウィンドウを一日中閉じて再オープンすることができ、使用するXmlDataProviderは変更されません。

この場合、おそらく2つのうちの1つが必要です。

まず、XmlDataProviderリソースの定義を子ウィンドウのXAMLに移動できます。これにより、子ウィンドウがロードされるたびに子ウィンドウにXMLが再ロードされます。

第2に、XMLファイルがディスク上で変更されるたびにXmlDataProviderを再作成するメソッドをメインウィンドウに追加できます。 (XMLファイルが変更されたときと、メインウィンドウでメソッドをトリガーする方法を知る方法は、解決するのが比較的難しい問題です。たとえば、FileSystemWatcherイベントを使用できます)。DynamicResourceマークアップ拡張子を使用する必要がありますXMLファイルが変更されるたびに子ウィンドウがリフレッシュされます(既に開いている場合でも)。

+0

mmmh ...今私は理解している。正確には、app.xamlで定義されたXmlDataProviderにItemSourceのバインドを持っています。子winのXAMLでxmldatasourceを定義しようとしましたが、リソース/コンテンツとして使用されているファイルに問題があります。こちらをご覧くださいhttp://stackoverflow.com/questions/6416918/wpf-bind-a-listview-to-a-xml-file-dynamically – Rick

関連する問題