2009-08-31 113 views
2

夠了 - 我花了一個小時搜索周圍,試圖找出如何從ListView中讀取ListViewSubItem值(如果這是XAML中的正確術語)。這裏有一個小的ListView:如何從WPF/XAML 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> 

,這裏是我的嘗試讀取這顯然是行不通的值:

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


    } 

任何人都可以點我在正確的方向? Grazie提前爲您提供幫助!

回答

3

ListView控件具有可以綁定您的收藏子項目的實例的依賴屬性「的SelectedItem」,即:

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

現在,您可以創建一個公開寫滿了你的項目一個ObservableCollection一個視圖模型,而這是你的SelectedItem項目的單個實例...

類似:

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 
} 

希望這有助於:)

伊恩

+0

確定 - 現在覺得不好意思......我剛剛重新閱讀你原來的問題,並意識到你已經知道SelectedItem屬性......看來你是唯一缺少的位是事實上你可以將它轉換成你的子對象的一個​​實例,所以不是: ListViewItem selected = CreatableAccounts.SelectedItem; 你可以說 ChildObject selected = CreatableAccounts.SelectedItem as ChildObject; 哼哼...... – kiwipom 2009-08-31 11:06:11

+0

不要擔心伊恩,我從你的代碼示例中學到了很多,它讓我認真研究了這個話題,這顯然需要。我現在沒有得到列表視圖來填充出於某種原因,所以我正在運行在這裏的MSDN教程,這似乎很徹底:http://msdn.microsoft.com/en-us/library/ms752347.aspx Grazie! Gregg – MrGreggles 2009-09-01 05:41:08

+0

非常歡迎:) – kiwipom 2009-09-01 07:29:22