Похоже, когда вы изменяете выбор в ComboBox, вы хотите, чтобы в текстовом поле отображался IP-адрес выбранной станции. Мы знаем, что это в столбце IP_stations
в таблице станций.
Мы уже обсуждали тот факт, что ItemsSource="{Binding}"
является избыточным, поэтому я опускаю это. Я опускаю обработчик, изменяющий выбор, потому что эта работа будет выполняться привязкой. Нет необходимости повторно запрашивать базу данных при изменении выбора, потому что у нас уже есть все столбцы всех строк в DataView, отображаемых в выпадающем списке.
Вы уже выучили DisplayMemberPath
, и мы будем использовать его злого близнеца SelectedValuePath
.
SelectedValuePath="IPStations"
сообщает комбинированному списку, что при изменении выделения он должен посмотреть на выбранный элемент (в данном случае DataRowView из DataView) и попытаться найти свойство или столбец (в нашем случае столбец) по этому название. Если он найдет его, ComboBox назначит значение этого столбца своему собственному свойству SelectedValue
. Затем мы учим текстовое поле обновляться, привязывая его свойство Text к stationComboBox_1.SelectedValue
.
Чтобы это работало, вам нужно выбрать оба значения из таблицы (я пренебрег этим в первый раз):
//Command to select all the station numbers and IPs
MySqlCommand cmd =
new MySqlCommand("Select stationNumber_stations, IP_stations from stations",
connection);
Готово.
<ComboBox
Grid.Column="1"
x:Name="stationComboBox_1"
Width="60"
HorizontalAlignment="Left"
DisplayMemberPath="stationNumber_stations"
SelectedValuePath="IP_stations"
/>
<TextBox
Text="{Binding SelectedValue, ElementName=stationComboBox_1}"
/>
ComboBox.Text
используется только в WPF в тех случаях, когда текст комбинированного списка является редактируемым.
Кстати, вот что вы могли бы сделать в обработчике изменения выбора:
private void stationComboBox_1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var cb = (sender as ComboBox);
// If SelectedValuePath is "IP_Stations", this will be the IP address.
// It will be the correct current selected value.
var selectedValue = cb.SelectedValue;
// Alternatively, we could do it this way:
var row = cb.SelectedItem as DataRowView;
if (row != null)
{
var selectedIP = row["IP_stations"];
}
}
Следующая проблема, по крайней мере, на мой взгляд, заключается в том, что вы копируете и вставляете все восемь раз. MVVM может вывести вас из этого беспорядка.