我有这段代码:
<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>
Combobox项目正确加载
我想知道的是,当我更新myXml.xml(因此是itemsource)时,是否有任何方法可以更新ScenariCombo.Items。
提前谢谢!
答案 0 :(得分:1)
一个选项可能是通过XML
监视FileSystemWatcher
文件中的更改,并在XML文件中进行更改后更新XmlDataProvider
。
在谷歌上搜索this。自定义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集合,然后使用属性更改通知刷新控件中的数据
答案 1 :(得分:0)
我终于理解了这一点。 这比预期容易。 你必须强制重新加载xmldataprovider:
XmlDataProvider xmlDataProvider = (XmlDataProvider)BaseGrid.FindResource("ScenesXml");
xmlDataProvider.Refresh();