Hi,
The ListView has a dependency property "SelectedItem" to which you can bind an instance of your collection child item, thus:
<DockPanel>
<Button DockPanel.Dock="Top" Click="Button_Click">Selected Item</Button>
<ListView ItemsSource="{Binding AllItems}" SelectedItem="{Binding SelectedItem}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
Now you can create a ViewModel that exposes an ObservableCollection filled with your items, and a single instance of an item which is your SelectedItem...
something like:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
WindowViewModel vm = new WindowViewModel();
this.DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
WindowViewModel vm = this.DataContext as WindowViewModel;
MessageBox.Show(vm.SelectedItem.Name);
}
}
public class WindowViewModel
{
public WindowViewModel()
{
AllItems = new ObservableCollection<Person>();
AllItems.Add(new Person { Name = "Joe", Age = 26 });
AllItems.Add(new Person { Name = "Mary", Age = 23 });
AllItems.Add(new Person { Name = "Bill", Age = 32 });
AllItems.Add(new Person { Name = "Harry", Age = 36 });
AllItems.Add(new Person { Name = "Julie", Age = 18 });
AllItems.Add(new Person { Name = "Claire", Age = 42 });
}
public ObservableCollection<Person> AllItems { get; set; }
private Person _selectedItem;
public Person SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value; }
}
}
public class Person : INotifyPropertyChanged
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
RaisePropertyChanged("Name");
}
}
}
public int Age
{
get { return _age; }
set
{
if (_age != value)
{
_age = value;
RaisePropertyChanged("Age");
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
Hope this helps :)
Ian