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