简体   繁体   中英

WPF get selected Combobox value which is bound to observablecollection

I have a ComboBox (CBaddress) which is bound to an ObservableCollection .

XAML

<ComboBox
   x:Name="CBaddress"
   Height="23"
   Margin="80,75,423,0"
   VerticalAlignment="Top" 
   ItemTemplate="{StaticResource AddressTemplate}"
   ItemsSource="{Binding}"
/>

<DataTemplate x:Key="AddressTemplate">
   <StackPanel Orientation="Horizontal">
      <TextBlock Width="50" Text="{Binding Path=ID_}" />
      <TextBlock Width="100" Text="{Binding Path=Address_}" />
      <TextBlock Width="30" Text="{Binding Path=HouseNumber_}" />
      <TextBlock Width="40" Text="{Binding Path=PostalCode_}" />
      <TextBlock Width="150" Text="{Binding Path=State_}" />
   </StackPanel>
</DataTemplate>

The ObservableCollection consists of a class (Address).

class Address
{
   public int ID_ { get; set; }
   public string Country_ { get; set; }
   public string State_ { get; set; }
   public int PostalCode_ { get; set; }
   public string Address_ { get; set; }
   public int HouseNumber_ { get; set; }
}

When my program starts it loads all values from a database and can display all values perfectly in the ComboBox :

CBaddress.DataContext = database.SelectAllAddresses();

But how do I get the values? With CBaddress.Text I get only this output :

MySQL_WPF.classes.Address

Is it possible to get the plain text, which is also displayed in the ComboBox ?

It would be best if I could get a certain value from the selected value, like the ID_ .

If you want to get the selected item, access it with the SelectedItem property on ComboBox .

var selectedID = ((Address)CBaddress.SelectedItem).ID_ ;

The SelectedItem property is of type object , so you need to cast it to your data type Address . Then you can access any of its properties as usual.

If you are working in an MVVM scenario, you would bind the SelectedItem to a property on your view model, eg SelectedAddress .

<ComboBox ...
          ItemsSource="{Binding}"
          SelectedItem={Binding SelectedAddress}"/>
private Address _selectedAddress;
public Address SelectedAddress
{
   get => _selectedAddress;
   set
   {
      if (_selectedAddress == value)
         return;

      _selectedAddress = value;
      OnPropertyChanged();
   }
}

Then you could access any property the same way, eg:

var selectedID = SelectedAddress.ID_;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM