How do I read subitem values from a list of WPF / XAML ListView controls?
Enough enough - I just spent an hour looking around trying to figure out how to read ListViewSubItem values (if that's the correct terminology in XAML) from a ListView. Here's a little ListView:
<ListView x:Name="CreatableAccounts" ItemsSource="{Binding Processable}" Margin="10,0">
<ListView.View>
<GridView>
<GridViewColumn Header="Site Name" DisplayMemberBinding="{Binding SiteName}"/>
<GridViewColumn Header="From Package" DisplayMemberBinding="{Binding FiCodeDLL.Name}"/>
</GridView>
</ListView.View>
</ListView>
and here's my attempt at reading values that clearly won't work:
private void CreateAccounts_Click(object sender, RoutedEventArgs e)
{
ListViewItem selected = CreatableAccounts.SelectedItem;
selected.Ite // no Items, Text or similar property
}
Can anyone point me in the right direction? Grazi in advance for your help!
+2
source to share
1 answer
The ListView has a "SelectedItem" dependency property to which you can bind an instance of the collection's child item, like this:
<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 provides an ObservableCollection filled with your items and one item instance that 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 it helps :)
Yang
+3
source to share