WPF访问ListView/GridView中的子项

WPF访问ListView/GridView中的子项,wpf,listview,gridview,subitem,Wpf,Listview,Gridview,Subitem,我正在尝试访问listview子项。我必须在这个ListView/GridView中动态插入列,因为这个程序访问具有不同值类型的多个数据库如果需要我可以将数据库搜索分成多个选项卡,但为了便于使用,我不想采用这种方法 我已经寻找了大约3-4天的解决方案。此类组织OleDB查询中的子项数据。下面是我正在使用的代码片段: public class Repair { public string RP { get; set; } public string

我正在尝试访问listview子项。我必须在这个ListView/GridView中动态插入列,因为这个程序访问具有不同值类型的多个数据库如果需要我可以将数据库搜索分成多个选项卡,但为了便于使用,我不想采用这种方法

我已经寻找了大约3-4天的解决方案。此类组织OleDB查询中的子项数据。下面是我正在使用的代码片段:

    public class Repair
    {
        public string RP { get; set; }
        public string SN { get; set; }
        public DateTime REC { get; set; }
        public DateTime START { get; set; }
        public string CUST { get; set; }
        public string SP { get; set; }
        public string TECH { get; set; }
        public string STATUS { get; set; }
        public string MODEL { get; set; }
        public string NOTES { get; set; }
        public DateTime ACCUSED { get; set; }
        public string ACCNOTES { get; set; }
        public int ID { get; set; }
    }
    public IList<Repair> OpenRepair { get; set; }
&

甚至尝试了Windows窗体方法,但显然不起作用


有人能至少给我指出正确的方向吗?我一直得到的错误消息是有意义的,因为它不能从对象泛型列表转换为类修复,然而,由于我对WPF相当陌生,我很难理解如何传递此消息

我测试了你的代码,它对我很有效,所以你可能在没有显示的部分犯了一些错误。但是让我试着说服你使用MVVM模式,从长远来看,它会让你的生活变得更加轻松

ViewModel和修复类(将DateTime替换为字符串):

使用系统;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Windows;
使用System.Windows.Input;
命名空间WpfApplication1.Models
{
公共类ListViewModel:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
公共可观测集合修复{get;private set;}
公共操作命令双击命令{get;private set;}
私人维修(选择维修);;
公共修复SelectedRepair{get{return}set{SelectedRepair=value;OnPropertyChanged(“SelectedRepair”);}
公共ListViewModel()
{
this.Repairs=新的可观察集合();
this.Repairs.Add(newrepair{RP=“1000”,SN=“A”,START=DateTime.Today.ToString(“d”),CUST=“C”,ID=0});
this.Repairs.Add(newrepair{RP=“2000”,SN=“D”,REC=DateTime.Today.AddDays(-2).ToString(“D”),CUST=“E”,ID=1});
this.DoubleClickCommand=新操作命令(DoubleClick);
}
私有void双击()
{
//做任何事情(可能不显示MessageBox…)
Show(string.Format(“修复:{1}{0}序列号:{2}”、Environment.NewLine、this.SelectedRepair.RP、this.SelectedRepair.SN));
}
}
公共类ActionCommand:ICommand
{
公共事件处理程序CanExecuteChanged;
私人行动;
公共操作命令(操作操作){u Action=Action;}
public bool CanExecute(对象参数){return true;}
public void Execute(对象参数){if(_action!=null)_action();}
}
公共级维修
{
公共字符串RP{get;set;}
公共字符串SN{get;set;}
公共字符串REC{get;set;}
公共字符串开始{get;set;}
公共字符串CUST{get;set;}
公共字符串SP{get;set;}
公共字符串技术{get;set;}
公共字符串状态{get;set;}
公共字符串模型{get;set;}
公共字符串注释{get;set;}
公共字符串{get;set;}
公共字符串ACCNOTES{get;set;}
公共int ID{get;set;}
}
}
观点:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:models="clr-namespace:WpfApplication1.Models"  
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        Title="MainWindow" Height="350" Width="500">
    <Window.DataContext>
        <models:ListViewModel />
    </Window.DataContext>
    <ListView ItemsSource="{Binding Repairs}" SelectedItem="{Binding SelectedRepair}" SelectionMode="Single" Margin="0,63,0,0" Background="DarkGray">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="RMA #" DisplayMemberBinding="{Binding RP}" />
                <GridViewColumn Header="Serial" DisplayMemberBinding="{Binding SN}"/>
                <GridViewColumn Header="Recieved" DisplayMemberBinding="{Binding REC}"/>
                <GridViewColumn Header="Start" DisplayMemberBinding="{Binding START}"/>
                <GridViewColumn Header="Customer" DisplayMemberBinding="{Binding CUST}"/>
                <GridViewColumn Header="Sales Person" DisplayMemberBinding="{Binding SP}"/>
                <GridViewColumn Header="Technician" DisplayMemberBinding="{Binding TECH}"/>
                <GridViewColumn Header="Status" DisplayMemberBinding="{Binding STATUS}"/>
                <GridViewColumn Header="Repair Notes" DisplayMemberBinding="{Binding NOTES}"/>
                <GridViewColumn Header="Accidental Used Date" DisplayMemberBinding="{Binding ACCUSED}"/>
                <GridViewColumn Header="Accidental Notes" DisplayMemberBinding="{Binding ACCNOTES}"/>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="0" />
            </GridView>
        </ListView.View>
    </ListView>
</Window>

在我的评论之后,这里有一个更完整的答案,供将来参考

所选对象(由
SelectedItem
显示的对象)可通过
SelectedValue
获得

使用
List
时,应执行以下操作:

((List<Repair>)searchListView.SelectedValue)[0].SN
((列表)searchListView.SelectedValue)[0]。序号

为什么要使用中间列表?您是否正在使用
项目资源
?您可以执行
((列表)searchListView.SelectedValue)[0]。SN
…@Pragmateek我一定是尝试了一些我发现的获取所选值的建议,但错漏了。我没有使用ItemsSource。我的道歉!我还尝试使用您的建议,我能够成功地将子项带过来,并且将是我将使用的!非常感谢。如果你把你的评论放在回答中,我会接受的。很高兴它能起作用!:)正如我所建议的,我已经添加了一个完整的答案。我正在阅读MVVM模式,我绝对同意它将使事情变得更容易,但我的问题是很难使它动态化。我正在与一些人打交道,他们宁愿只查看一个listview。如果是更懂技术的人,当然,但不幸的是不是。缺少的代码是Catch,最后是Try过程之后的内部代码。在这种情况下,没有什么会让房子倒塌。谢谢你花时间和精力在这件事上!对于我将来制作的程序,我肯定会使用MVVM模式,很遗憾,我不能在这一个中使用。不用担心。至于MVVM,我也花了一些时间来思考这个问题,但我觉得在这个模式中没有不能编程的情况。在非常复杂的场景中,行为是一个缺失的环节,但通常甚至不是必需的。
                Repair lvi = (Repair)searchListView.SelectedItems[0];
                System.Windows.MessageBox.Show(lvi.RP + " " + lvi.SN + " " + lvi.SP);
          Repair lvi = (Repair)this.customersListView.SelectedItem;
          MessageBox.Show(string.Format("Repair: {1}{0}Serial Number:{2}", Environment.NewLine, lvi.RP, lvi.SN));
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1.Models
{
    public class ListViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public ObservableCollection<Repair> Repairs { get; private set; }
        public ActionCommand DoubleClickCommand { get; private set; }

        private Repair _selectedRepair;
        public Repair SelectedRepair { get { return _selectedRepair; } set { _selectedRepair = value; OnPropertyChanged("SelectedRepair"); } }

        public ListViewModel()
        {
            this.Repairs = new ObservableCollection<Repair>();
            this.Repairs.Add(new Repair { RP = "1000", SN = "A", START = DateTime.Today.ToString("d"), CUST = "C", ID = 0 });
            this.Repairs.Add(new Repair { RP = "2000", SN = "D", REC = DateTime.Today.AddDays(-2).ToString("d"), CUST = "E", ID = 1 });

            this.DoubleClickCommand = new ActionCommand(DoubleClick);
        }

        private void DoubleClick()
        {
            // do whatever (probably not show a MessageBox..)
            MessageBox.Show(string.Format("Repair: {1}{0}Serial Number:{2}", Environment.NewLine, this.SelectedRepair.RP, this.SelectedRepair.SN));
        }
    }

    public class ActionCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        private Action _action;
        public ActionCommand(Action action) { _action = action; }
        public bool CanExecute(object parameter) { return true; }
        public void Execute(object parameter) { if (_action != null) _action(); }
    }

    public class Repair
    {
        public string RP { get; set; }
        public string SN { get; set; }
        public string REC { get; set; }
        public string START { get; set; }
        public string CUST { get; set; }
        public string SP { get; set; }
        public string TECH { get; set; }
        public string STATUS { get; set; }
        public string MODEL { get; set; }
        public string NOTES { get; set; }
        public string ACCUSED { get; set; }
        public string ACCNOTES { get; set; }
        public int ID { get; set; }
    }
}
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:models="clr-namespace:WpfApplication1.Models"  
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        Title="MainWindow" Height="350" Width="500">
    <Window.DataContext>
        <models:ListViewModel />
    </Window.DataContext>
    <ListView ItemsSource="{Binding Repairs}" SelectedItem="{Binding SelectedRepair}" SelectionMode="Single" Margin="0,63,0,0" Background="DarkGray">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="RMA #" DisplayMemberBinding="{Binding RP}" />
                <GridViewColumn Header="Serial" DisplayMemberBinding="{Binding SN}"/>
                <GridViewColumn Header="Recieved" DisplayMemberBinding="{Binding REC}"/>
                <GridViewColumn Header="Start" DisplayMemberBinding="{Binding START}"/>
                <GridViewColumn Header="Customer" DisplayMemberBinding="{Binding CUST}"/>
                <GridViewColumn Header="Sales Person" DisplayMemberBinding="{Binding SP}"/>
                <GridViewColumn Header="Technician" DisplayMemberBinding="{Binding TECH}"/>
                <GridViewColumn Header="Status" DisplayMemberBinding="{Binding STATUS}"/>
                <GridViewColumn Header="Repair Notes" DisplayMemberBinding="{Binding NOTES}"/>
                <GridViewColumn Header="Accidental Used Date" DisplayMemberBinding="{Binding ACCUSED}"/>
                <GridViewColumn Header="Accidental Notes" DisplayMemberBinding="{Binding ACCNOTES}"/>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="0" />
            </GridView>
        </ListView.View>
    </ListView>
</Window>
((List<Repair>)searchListView.SelectedValue)[0].SN