[英]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.