обновить выпадающий список при обновлении xmldataprovider - PullRequest
0 голосов
/ 16 января 2012

У меня есть этот код:

<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>

Элементы комбинированного списка загружены правильно.
Я хочу знать, есть ли способ обновить ScenariCombo.Items при обновлении myXml.xml (такПункт источника).
Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 января 2012

Одним из вариантов может быть отслеживание изменений в файле XML через FileSystemWatcher и обновление XmlDataProvider после внесения изменений в файл XML.

На небольшом поиске я нашел это . Пользовательский XMLDataProvider со встроенной функцией поиска любых изменений в XML-файле с помощью FileSystemWatcher.

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();
        }
    }

Это будет работать в вашем сценарии. Взгляните на связанную статью, например, и более подробную информацию

Редактировать

Вы можете сделать две вещи.

Либо создайте свойство, содержащее путь к исходному файлу, и свяжите его со свойством Source объекта XMLDataProvider. Как только файл получит изменения, вызовите событие измененного свойства, чтобы поставщик данных XML обновлял / перезагружал свой источник (я не проверял это)

или

Обновите XMLDataProvider с помощью кода путем сброса источника в тот же файл.

Сказав, что я должен сказать, что это неправильный способ играть с XML. В идеале вы должны загрузить XML в некоторую структуру данных, например, в коллекцию Observable, а затем использовать уведомление об изменении свойства, чтобы обновить данные в вашем элементе управления

0 голосов
/ 10 февраля 2012

Я наконец понял это.Это было проще, чем ожидалось.Вы должны принудительно перезагрузить xmldataprovider:

XmlDataProvider xmlDataProvider = (XmlDataProvider)BaseGrid.FindResource("ScenesXml");
xmlDataProvider.Refresh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...