Bounded to ComboBox
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="DisplayAndValueMemberBinding" Height="300" Width="300"> <Window.Resources> <local:People x:Key="Family"> <local:Person Name="A" Age="11" /> <local:Person Name="B" Age="12" /> <local:Person Name="C" Age="38" /> </local:People> <local:NamedAges x:Key="NamedAgeLookup"> <local:NamedAge NameForAge="zero" AgeId="0" /> <local:NamedAge NameForAge="one" AgeId="1" /> <local:NamedAge NameForAge="two" AgeId="2" /> </local:NamedAges> </Window.Resources> <StackPanel DataContext="{StaticResource Family}"> <ListBox Name="lb" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name" SelectedValuePath="Age" /> <TextBox Grid.Row="1" Text="{Binding Path=Name}" /> <ComboBox Grid.Row="2" ItemsSource="{Binding Source={StaticResource NamedAgeLookup}}" DisplayMemberPath="NameForAge" SelectedValuePath="AgeId" SelectedValue="{Binding Path=Age}" /> <Button Name="birthdayButton">Birthday</Button> <Button Name="backButton">Back</Button> <Button Name="forwardButton">Forward</Button> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Collections.ObjectModel; using System.ComponentModel; namespace WpfApplication1 { public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void Notify(string propName) { if( this.PropertyChanged != null ) { PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } string name; public string Name { get { return this.name; } set { this.name = value; Notify("Name"); } } int age; public int Age { get { return this.age; } set { this.age = value; Notify("Age"); } } } class People : ObservableCollection<Person> { } public class NamedAge : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void Notify(string propNameForAge) { if( this.PropertyChanged != null ) { PropertyChanged(this, new PropertyChangedEventArgs(propNameForAge)); } } string nameForAge; public string NameForAge { get { return this.nameForAge; } set { this.nameForAge = value; Notify("NameForAge"); } } int ageId; public int AgeId { get { return this.ageId; } set { this.ageId = value; Notify("AgeId"); } } } class NamedAges : ObservableCollection<NamedAge> { } public partial class Window1 : System.Windows.Window { public Window1() { InitializeComponent(); lb.MouseDoubleClick += lb_MouseDoubleClick; this.birthdayButton.Click += birthdayButton_Click; this.backButton.Click += backButton_Click; this.forwardButton.Click += forwardButton_Click; } void lb_MouseDoubleClick(object sender, MouseButtonEventArgs e) { int index = lb.SelectedIndex; if( index < 0 ) { return; } Person item = (Person)lb.SelectedItem; int value = (int)lb.SelectedValue; Console.WriteLine(index); Console.WriteLine(item.Name); Console.WriteLine(item.Age); Console.WriteLine(value); } ICollectionView GetFamilyView() { People people = (People)this.FindResource("Family"); return CollectionViewSource.GetDefaultView(people); } void birthdayButton_Click(object sender, RoutedEventArgs e) { ICollectionView view = GetFamilyView(); Person person = (Person)view.CurrentItem; ++person.Age; Console.WriteLine(person.Name); Console.WriteLine(person.Age); } void backButton_Click(object sender, RoutedEventArgs e) { ICollectionView view = GetFamilyView(); view.MoveCurrentToPrevious(); if( view.IsCurrentBeforeFirst ) { view.MoveCurrentToFirst(); } } void forwardButton_Click(object sender, RoutedEventArgs e) { ICollectionView view = GetFamilyView(); view.MoveCurrentToNext(); if( view.IsCurrentAfterLast ) { view.MoveCurrentToLast(); } } } }