2009-08-31 5 views
2

Assez est assez - Je viens de passer une heure à chercher autour de savoir comment lire les valeurs ListViewSubItem (si c'est la terminologie correcte dans XAML) à partir d'un ListView. Voici un petit ListView:Comment lire les valeurs de sous-éléments à partir d'un ListView WPF/XAML?

<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> 

et voici ma tentative de lire les valeurs qui est clairement ne va pas fonctionner:

private void CreateAccounts_Click(object sender, RoutedEventArgs e) 
    { 
     ListViewItem selected = CreatableAccounts.SelectedItem; 
     selected.Ite // no Items, Text or similar property 


    } 

Quelqu'un peut-il me diriger dans la bonne direction? Grazie à l'avance pour votre aide!

Répondre

3

ListView a une propriété de dépendance « SelectedItem » auquel vous pouvez lier une instance de votre article enfant collection, ainsi:

<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> 

Maintenant, vous pouvez créer un ViewModel qui expose un ObservableCollection rempli de vos articles, et une seule instance d'un élément qui est votre SelectedItem ...

quelque chose comme:

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

+0

OK - maintenant je me sens penaud ... Je viens de relire votre question initiale et se rendre compte que vous saviez déjà sur la propriété SelectedItem ... semble le seul peu que vous manquait plus que la fait que vous pouvez le transformer en une instance de votre objet enfant, donc au lieu de: ListViewItem selected = CreatableAccounts.SelectedItem; vous auriez pu dire ChildObject selected = CreatableAccounts.SelectedItem comme ChildObject; ho hum ... – kiwipom

+0

Ne vous inquiétez pas Ian, j'ai beaucoup appris de votre exemple de code et cela m'a amené à étudier sérieusement le sujet, ce qui est clairement nécessaire. Je ne reçois pas l'affichage de la liste à remplir pour une raison quelconque, donc je cours ici à travers le tutoriel sur MSDN, qui semble assez complet: http://msdn.microsoft.com/fr-fr/library/ms752347.aspx Grazie! Gregg – MrGreggles

+0

vous êtes les bienvenus :) – kiwipom

Questions connexes