【问题标题】:How to read the subitem values from a WPF/XAML ListView?如何从 WPF/XAML ListView 中读取子项值?
【发布时间】:2009-08-31 06:45:53
【问题描述】:

足够了 - 我刚刚花了一个小时搜索试图找出如何从 ListView 读取 ListViewSubItem 值(如果这是 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


    }

谁能指出我正确的方向?提前感谢您的帮助!

【问题讨论】:

    标签: wpf xaml listview listviewitem


    【解决方案1】:

    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>
    

    现在您可以创建一个 ViewModel,它公开一个填充了您的项目的 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
    }
    

    希望这会有所帮助:)

    伊恩

    【讨论】:

    • 好的 - 所以现在我感到羞耻......我刚刚重新阅读了你原来的问题,并意识到你已经知道 SelectedItem 属性......似乎你唯一缺少的是事实上,您可以将它转换为您的子对象的一个​​实例,所以不是: ListViewItem selected = CreatableAccounts.SelectedItem;你可以说 ChildObject selected = CreatableAccounts.SelectedItem as ChildObject;哼哼……
    • 别担心,Ian,我从你的代码示例中学到了很多东西,它让我认真研究了这个主题,这显然是需要的。由于某种原因,我现在无法填充列表视图,所以我在这里浏览了 MSDN 上的教程,这似乎非常彻底:msdn.microsoft.com/en-us/library/ms752347.aspxGrazie!格雷格
    猜你喜欢
    • 2020-07-05
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2015-02-11
    相关资源
    最近更新 更多