Как инициализировать или связать ListItems, которые определены в App.config, в поле со списком VB.Net wpf

Я разрабатываю тестовое приложение, которое будет гибко использоваться на нескольких станциях, чтобы пользователь мог определить цель использования. Раньше я устанавливал это с помощью файла txt .ini (используя VB 6 или Python), но, следуя рекомендациям философии VB.Net, я пытаюсь использовать файл XML App.config для работы в качестве источника данных инициализации. Следуя этому подходу, я использовал средства машинного кодирования таблицы настройки App.config (сначала введя строку в поле значения таблицы настроек, введя ее, а затем удалив). Таким образом, у меня есть машинописный фрагмент кода VML, который я прикрепляю ниже:

<?xml version="1.0" encoding="utf-8" ?>

В соответствии с моим намерением заполнить поле со списком строками, которые могут быть выбраны пользователем для распространения конфигурации, специфичной для параметра, я выбрал: System.Collections.Specialized.StringCollection в качестве типа переменной в таблице настроек для это приложение.

Мои трудности заключаются в том, что я не могу найти никакого определения того, как ввести список строк в XML-файл App.config. Кроме того, я не понимаю, как связать такой список строк с ListIndex в WPF ComboBox. Я могу найти примеры привязки между элементами управления на странице, но ни одного из XML-файла App.config, который, как я полагаю, обрабатывается событием запуска приложения.

Любое понимание будет приветствоваться.


person Oliver    schedule 26.03.2018    source источник


Ответы (1)


Как насчет совсем другого подхода. Сохраните список в формате XML из отдельной утилиты. Затем десериализуйте и привяжите к ComboBox.

Class MainWindow
    Private lst As New List(Of String)
Private Sub btnFillCombo_Click(sender As Object, e As RoutedEventArgs) Handles btnFillCombo.Click
    '1. Create an instance of XML Serializer
    Dim xs As XmlSerializer = New XmlSerializer(GetType(List(Of String)))
    '2. Create a Stream for your file
    Using fs As Stream = New FileStream("MyList.xml", FileMode.Open, FileAccess.Read, FileShare.None)
        '3. Deserialize your Stream and cast to List(Of String)
        lst = CType(xs.Deserialize(fs), List(Of String))
    End Using
    cboList.ItemsSource = lst
End Sub


    Private Sub btnSaveList_Click(sender As Object, e As RoutedEventArgs) Handles btnSaveList.Click
        ' FileStream(FileName, Mode, Access, Share) intellisense overload #9 out of 15
        Using fs As Stream = New FileStream("MyList.xml", FileMode.Create, FileAccess.Write, FileShare.None)
            Dim xs As XmlSerializer = New XmlSerializer(GetType(List(Of String)))
            xs.Serialize(fs, lst)
        End Using
    End Sub

    Private Sub btnLoadList_Click(sender As Object, e As RoutedEventArgs) Handles btnLoadList.Click
        lst.Add("Mathew")
        lst.Add("Mark")
        lst.Add("Luke")
        lst.Add("John")
    End Sub
End Class

btnLoadList и btnSaveList будут находиться в отдельной утилите, запускаемой только один раз.

person Mary    schedule 27.03.2018
comment
Сначала я был удивлен, увидев, что вы предлагаете активировать десериализацию с помощью события нажатия кнопки. Я исследовал, почему вы не предложили для этого конструктор главного окна. Я обнаружил, что можно использовать обработчик запуска в файле кода application.xaml.vb. Это часть реализации контейнера, который запускает главное окно с помощью метода .Show() после заполнения зависимостей. Однако класс контейнера является частью EnterpriseLibraryCoreExtension, а не частью пакета VS Community! Позор: нам нужно нажать кнопку, чтобы инициализировать приложение VB.Net! - person Oliver; 27.03.2018
comment
Этот код мог быть в форме загрузки. Я просто поместил его в кнопку для целей тестирования. - person Mary; 28.03.2018
comment
Я реализовал, как вы предложили, за исключением того, что десериализация выполняется в методе конструктора в классе MainWindow. Теперь работает отлично. В интересах других, желающих создать своего рода файл инициализации приложения, я последовал предложению Мэри. Я создал приложение для создания конфигурации, в котором машина сначала записывает файл XML с жестко запрограммированным списком строк. Затем я изменил это приложение, прочитанное в файле XML, чтобы его содержимое можно было отредактировать, чтобы создать обновленный исправленный файл config.xml. Конечно, я десериализовал файл config.xml в своем основном приложении, которое, конечно же, использует этот файл для его инициализации. - person Oliver; 28.03.2018
comment
Я так рад, что это сработало, и спасибо за расширенную информацию об архитектуре. Если мой ответ был полезен, пожалуйста, примите его, поставив галочку слева от ответа. - person Mary; 29.03.2018