WPF устанавливает значение запуска в выпадающем списке

#c# #wpf #combobox

#c# #wpf #поле со списком

Вопрос:

У меня есть приложение WPF, в котором пользователь может установить настройку последовательного порта. При запуске я хочу установить поля со списком для настроек serialport с последним параметром, использованным ранее. Эти настройки хранятся в файле app.config. Для четности, стоп-битов и сопоставления работает нормально, но для скорости передачи данных и количества битов данных я не могу установить значение по умолчанию при запуске. Единственная разница для baudrate и databits заключается в том, что я добавляю элементы для combobox в файл xaml. Для других настроек я добавляю элементы динамически при запуске.

Для скорости передачи данных и я делаю :

 <ComboBox x:Name="BaudrateCmbbox" FontSize="12" SelectionChanged="BaudrateCmbbox_SelectionChanged">
      <ComboBoxItem>9600</ComboBoxItem>
      <ComboBoxItem>19200</ComboBoxItem>
      <ComboBoxItem>38400</ComboBoxItem>
      <ComboBoxItem>115200</ComboBoxItem>
</ComboBox>  

Для битов данных, которые я делаю

 <ComboBox x:Name="DatabitsCmbbox" FontSize="12" SelectionChanged="DatabitsCmbbox_SelectionChanged">
    <ComboBoxItem>7</ComboBoxItem>
    <ComboBoxItem>8</ComboBoxItem>
</ComboBox>  

Поля со списком для четности, стоп-битов и имени порта заполняются через

 private  void SetPortParity()
    {
        foreach (string s in Enum.GetNames(typeof(Parity)))
        {
           ParityCmbbox.Items.Add(s);
        }
    }

    private void SetPortName()
    {
        foreach (string s in SerialPort.GetPortNames())
        {
            ComportsCmbbox.Items.Add(s);
        }
    }
    
    private void Stopbits()
    {
        foreach (string s in Enum.GetNames(typeof(StopBits)))
        {
            StopbitsCmbbox.Items.Add(s);
        }
    }
  

В методе «Window_loaded» я делаю :

  private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        
        SetPortParity();
        SetPortName();
        Stopbits();
       

        BaudrateCmbbox.SelectedItem = ConfigurationManager.AppSettings.Get("Baudrate");
        DatabitsCmbbox.SelectedItem = ConfigurationManager.AppSettings.Get("Databits");
        ParityCmbbox.SelectedItem = ConfigurationManager.AppSettings.Get("Parity");
        StopbitsCmbbox.SelectedItem = ConfigurationManager.AppSettings.Get("StopBits");
        ComportsCmbbox.SelectedItem = ConfigurationManager.AppSettings.Get("Comport");

    }
  

Проблема здесь в том, что я не могу установить значения baudrate и databits из app.config.
Остальные настройки работают нормально.

Как я могу решить эту проблему

Ответ №1:

Это потому, что ConfigurationManager.AppSettings.Get(«Скорость передачи данных») и ConfigurationManager.AppSettings.Get(«Databits») возвращает строку, но элементы SelectedItem в ваших выпадающих списках Baudrate amp; Databits являются элементами со списком.

Вместо этого вы могли бы установить SelectedValuePath=»Content» в своем списке Baudrate amp; Databits, а в выпадающих списках данных установить SelectedValue вместо SelectedItem:

BaudrateCmbbox.SelectedValue = ConfigurationManager.AppSettings.Get(«Baudrate»); DatabitsCmbbox.SelectedValue = ConfigurationManager.AppSettings.Get(«Databits»)

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

Комментарии:

1. Я сделал так, как вы предложили, и это работает, большое спасибо. Но я все еще в замешательстве. Строка «ConfigurationManager. AppSettings.Get(«StopBits);» также возвращает строку, и я могу установить StopbitsCmbbox.SelectedItem. В чем разница между, скажем, BaudrateCmbbox.SelectedItem и Stopbits. Выбранный элемент

2. Ну, это потому, что вы добавляете строки в выпадающие списки Stopbits, Parity и PortName с помощью StopbitsCmbbox. Товары. Добавить (ы). Но с помощью Baudrate DataBits вы добавляете элементы списка с помощью: <ComboBoxItem>9600</ComboBoxItem>. По сути, коллекция элементов в ComboBox НЕ обязательно должна быть ComboBoxItems.