更新xmldataprovider时刷新组合框

时间:2012-01-16 14:57:55

标签: c# wpf data-binding

我有这段代码:

<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。
提前谢谢!

2 个答案:

答案 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();