xmlファイルのINotifyCollectionChanged火災のようなものに変更
-
22-09-2019 - |
質問
これは、変更され、このファイルにxmlファイルからフィルタリングされたデータをバインドすることを可能にするためにINotifyCollectionChangedまたはIObservableのような他のインターフェイスを実装することが可能ですか?私は、ファイルの変更を持つプロパティまたはコレクションが、何との例を参照してください?
私は、リストボックスにフィルタと結合したXMLデータにそのコードを持っています:
XmlDocument channelsDoc = new XmlDocument();
channelsDoc.Load("RssChannels.xml");
XmlNodeList channelsList = channelsDoc.GetElementsByTagName("channel");
this.RssChannelsListBox.DataContext = channelsList;
解決
FileSystemWatcher
を使用してみてください private static void StartMonitoring()
{
//Watch the current directory for changes to the file RssChannels.xml
var fileSystemWatcher = new FileSystemWatcher(@".\","RssChannels.xml");
//What should happen when the file is changed
fileSystemWatcher.Changed += fileSystemWatcher_Changed;
//Start watching
fileSystemWatcher.EnableRaisingEvents = true;
}
static void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
Debug.WriteLine(e.FullPath + " changed");
}
他のヒント
あなたはファイルシステムの変更は、System.IOにFileSystemWatcherクラスを使用するために見て、自分でINotifyCollectionChangedを実装する必要があります。
XmlDocument
はすでにNodeChanged
イベントを発生させます。あなたのバインディングのソースとしてXmlDataProvider
を使用している場合、それはNodeChanged
イベントやリフレッシュバインディングに耳を傾けます。あなたはそのDocument
プロパティを変更する場合にもバインディングをリフレッシュします。 FileSystemWatcher
とそれを組み合わせて、あなたはあなたの方法にしている。
簡単な例:
<Window x:Class="WpfApplication18.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<XmlDataProvider x:Key="Data" XPath="/Data">
<x:XData>
<Data xmlns="">
<Channel>foo</Channel>
<Channel>bar</Channel>
<Channel>baz</Channel>
<Channel>bat</Channel>
</Data>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<StackPanel Margin="50">
<ListBox ItemsSource="{Binding Source={StaticResource Data}, XPath=Channel}" />
<Button Margin="10"
Click="ReloadButton_Click">Reload</Button>
<Button Margin="10"
Click="UpdateButton_Click">Update</Button>
</StackPanel>
</Window>
イベントハンドラます:
private void ReloadButton_Click(object sender, RoutedEventArgs e)
{
XmlDocument d = new XmlDocument();
d.LoadXml(@"<Data xmlns=''><Channel>foobar</Channel><Channel>quux</Channel></Data>");
XmlDataProvider p = Resources["Data"] as XmlDataProvider;
p.Document = d;
}
private void UpdateButton_Click(object sender, RoutedEventArgs e)
{
XmlDataProvider p = Resources["Data"] as XmlDataProvider;
XmlDocument d = p.Document;
foreach (XmlElement elm in d.SelectNodes("/Data/Channel"))
{
elm.InnerText = "Updated";
}
}
所属していません StackOverflow