none
Binding коллекции строк соединения к ListBox-у RRS feed

  • Вопрос

  • Прошу совета у уважаемого сообщества.

    Обстановка:

    1. Из файла конфигурации получена секция строк подключения методом:

            private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
            {
                // Открыли файл конфигурации
                Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                // Взяли секцию строки соединения. 
                ConnectionStringsSection connectionStringsSection = configuration.ConnectionStrings;
            }

    Дебаггер показал, что все что нужно присутствует, содержится в строке connectionStringsSection. Частичный файл конфигурации connectionstrings.config имеет вид:

    <connectionStrings>
     <add name="LocalSqlServer2" connectionString="Data Source=dbdevinfra;Integrated Security=True"
      providerName="System.Data.SqlClient" />
     <add name="Моя строка" connectionString="Initial catalog = C:\Temp\789kljh.mdf" />
     <add name="Yjdfz" connectionString="Initial catalog = C:\Temp\dfgh.mdf" />
     <add name="ывапр" connectionString="Initial catalog = C:\Temp\апроь.mdf" />
     <add name="&quot;&quot;" connectionString="Initial catalog = C:\Temp\sdfgsdfg.mdf" />
     <add name="&quot;lkughuh&quot;" connectionString="Initial catalog = " />
     <add name="&quot;djhdj&quot;" connectionString="Initial catalog = " />
     <add name="&quot;qwertwertg&quot;" connectionString="Initial catalog = C:\Temp\qawerf.mdf" />
     <add name="&quot;3651&quot;" connectionString="Initial catalog = C:\Temp\6854.mdf" />
     <add name="&quot;фцка56&quot;" connectionString="Initial catalog = C:\Temp\екрне5н5.mdf" />
     <add name="&quot;вапрвапр&quot;" connectionString="Initial catalog = C:\Temp\авпрпар.mdf" />
     <add name="&quot;sfjhsfgh&quot;" connectionString="Initial catalog = C:\Users\admin\Documents\wsrfg.mdf" />
    </connectionStrings>

    Задача:

    Необходимо отобразить список "name" в ListBox:

    <ListBox x:Name="lBConnectionStrings" Grid.Column="1" Margin="5" Grid.Row="1" Grid.RowSpan="4">

    Комментарии: Трехдневные поиски по инетресурсам удовлетворительного результата не дали. 

    Вопрос : Как с наименьшими затратами прибиндить содержимое  connectionStringsSection к ListBox-у? Интересуют возможные сценарии решения задачи и, если возможно, примеры.



    21 апреля 2016 г. 7:45

Ответы

  • Добрый день

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) {

    // открываем ConnectionStrings; var connectionStringsSection = ConfigurationManager.ConnectionStrings;

    // устанавливаем как источник для ListBox lBConnectionStrings.ItemsSource = connectionStringsSection; }

    и для разметки 

     <ListBox x:Name="lBConnectionStrings" Grid.Column="1" Margin="5" Grid.Row="1" Grid.RowSpan="4">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"></TextBlock>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

    в итоге 


    21 апреля 2016 г. 9:21

Все ответы

  • Добрый день

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) {

    // открываем ConnectionStrings; var connectionStringsSection = ConfigurationManager.ConnectionStrings;

    // устанавливаем как источник для ListBox lBConnectionStrings.ItemsSource = connectionStringsSection; }

    и для разметки 

     <ListBox x:Name="lBConnectionStrings" Grid.Column="1" Margin="5" Grid.Row="1" Grid.RowSpan="4">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"></TextBlock>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

    в итоге 


    21 апреля 2016 г. 9:21
  • Не могу решить простую задачу: Обновление данного листа при добавлении в файл конфигурации новой строки подключения.

    Строка добавляется из окошка методом:

            private static void AddSaveConnectionString(Configuration configuration,
        ConnectionStringSettings connectionStringSettings)
            {
                try
                {
                    // Взяли секцию строки соединения. 
                    ConnectionStringsSection connectionStringsSection = configuration.ConnectionStrings;
                    // Добавление новой секции в файл конфигурации.
                    connectionStringsSection.ConnectionStrings.Add(connectionStringSettings);
                    // Сохранение файла конфигурации.
                    configuration.Save(ConfigurationSaveMode.Minimal);
                    ConfigurationManager.RefreshSection("connectionStrings");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

    Предполагал, что обновление сделать просто, строчкой, напр. что-то типа 

    , NotifyOnSourceUpdated=True

    Ан нет. Оказывается это нужно делать применив ObservableCollection. 

    Собственно вопрос:

    1. Как заполнить коллекцию ObservableCollection перечнем строк подключения, полученным из файла конфигурации и привязать ее к ListBox-у обеспечив при этом его динамическое обновление?

    22 апреля 2016 г. 23:33
  • Ответ самому себе:

    Все очень просто:

            private void ButtonNewBase_OnClick(object sender, RoutedEventArgs e)
            {
                // Вызываю модальное окно ввода параметров новой базы данных
                NewBase windowNewBase = new NewBase { Owner = this };
                windowNewBase.ShowDialog();
                // открываем ConnectionStrings;
                var connectionStringsSection = ConnectionStrings;
                // устанавливаем как источник для ListBox
                lBConnectionStrings.ItemsSource = connectionStringsSection;
            }

    Всего пару строчек кода, но.. копипаст :(. 

    Вопрос. Есть ли другое (более правильное) решение обновления ListBox? 

     
    29 апреля 2016 г. 18:30