[英]refresh combobox when xmldataprovider is updated
我有此代碼:
<Grid>
<Grid.Resources>
<XmlDataProvider x:Name="ScenesXmlName" x:Key="ScenesXml"
XPath="scenari-list/scenario"
Source="myXml.xml"/>
</Grid.Resources>
<ComboBox Name="ScenariCombo"
ItemsSource="{Binding Source={StaticResource ScenesXml}}"
DisplayMemberPath="@name"
SelectionChanged="ScenariCombo_SelectionChanged" />
</Grid>
組合框項目已正確加載。
我想知道的是,當我更新myXml.xml(因此itemsource)時,是否有任何方法可以更新ScenariCombo.Items。
提前致謝!
一種選擇是通過FileSystemWatcher
監視XML
文件中的更改,並在XML
文件中進行更改后更新XmlDataProvider
。
在小小的谷歌搜索中,我發現了這一點 。 具有內置功能的自定義XMLDataProvider
,可以通過FileSystemWatcher
查找XML文件中的任何更改。
public class MyXmlDataProvider : XmlDataProvider
{
public new Uri Source
{
get { return base.Source; }
set
{
base.Source = value;
FileSystemWatcher watcher = new FileSystemWatcher();
//set the path of the XML file appropriately as per your requirements
watcher.Path = AppDomain.CurrentDomain.BaseDirectory;
//name of the file i am watching
watcher.Filter = value.OriginalString;
//watch for file changed events so that we can refresh the data provider
watcher.Changed += new FileSystemEventHandler(file_Changed);
//finally, don't forget to enable watching, else the events won't fire
watcher.EnableRaisingEvents = true;
}
}
void file_Changed(object sender, FileSystemEventArgs e)
{
base.Refresh();
}
}
它將在您的情況下工作。 以鏈接文章為例,以及更多詳細信息
編輯
您可以做兩件事。
創建一個包含源文件路徑的屬性,並將其與XMLDataProvider的Source屬性綁定。 文件更改后,引發一個屬性更改事件,以便XML數據提供程序更新/重新加載其源(我尚未測試過此東西)
要么
通過將源重置為同一文件,通過代碼更新XMLDataProvider。
話雖如此,我必須說這不是使用XML的正確方法。 理想情況下,您應該將XML加載到某些數據結構(如Observable集合)中,然后使用屬性更改通知來刷新控件中的數據
我終於明白了。 這比預期的要容易。 您必須強制重新加載xmldataprovider:
XmlDataProvider xmlDataProvider = (XmlDataProvider)BaseGrid.FindResource("ScenesXml");
xmlDataProvider.Refresh();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.