Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF数据网格绑定到自定义类_C#_Wpf_Datagrid - Fatal编程技术网

C# WPF数据网格绑定到自定义类

C# WPF数据网格绑定到自定义类,c#,wpf,datagrid,C#,Wpf,Datagrid,我认为解决办法应该非常简单。我试图实现的是只显示自定义类型的泛型列表中包含的数据。我只是想显示数据,我不需要做任何类型的数据操作,我会对最简单的解决方案感兴趣。第一个网格工作正常,它显示数据,但是,我无法填充第二个网格。你能给我指一下正确的方向吗。在网上找不到类似的东西。谢谢 以下是我的两个数据网格: <DataGrid x:Name="grdMyData" HorizontalAlignment="Left" Margin="78,78,0,0" VerticalAlignmen

我认为解决办法应该非常简单。我试图实现的是只显示自定义类型的泛型列表中包含的数据。我只是想显示数据,我不需要做任何类型的数据操作,我会对最简单的解决方案感兴趣。第一个网格工作正常,它显示数据,但是,我无法填充第二个网格。你能给我指一下正确的方向吗。在网上找不到类似的东西。谢谢

以下是我的两个数据网格:

    <DataGrid x:Name="grdMyData" HorizontalAlignment="Left" Margin="78,78,0,0" VerticalAlignment="Top" Height="94" Width="321"/>

    <DataGrid x:Name="grdMyData2" ItemsSource="{Binding XPath=Car}" HorizontalAlignment="Left" Height="101" Margin="78,198,0,0" VerticalAlignment="Top" Width="321">       
    </DataGrid>

和代码隐藏:

    private List<Car> myCars = new List<Car>();
    private List<Vehicle> myVehicles = new List<Vehicle>();

    private class Vehicle
    {
        public Car MyCar { get; set; }
    }

    private class Car
    {
        public string Type { get; set; }
        public string Color { get; set; }
        public int DoorsNo { get; set; }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var car1 = new Car(){Type = "hatchback", Color = "blue", DoorsNo = 5};
        var car2 = new Car() { Type = "sedan", Color = "red", DoorsNo = 4 };
        var car3 = new Car() { Type = "sedan", Color = "blach", DoorsNo = 4 };

        myCars.Add(car1);
        myCars.Add(car2);
        myCars.Add(car3);

        grdMyData.ItemsSource = myCars;

        var vehicle1 = new Vehicle() {MyCar = car1};
        var vehicle2 = new Vehicle() {MyCar = car2};
        var vehicle3 = new Vehicle() {MyCar = car3};
        myVehicles.Add(vehicle1);
        myVehicles.Add(vehicle2);
        myVehicles.Add(vehicle3);

        grdMyData2.DataContext = myVehicles;
    }
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        //private List<Car> myCars = new List<Car>();
        private List<Vehicle> myVehicles = new List<Vehicle>();

        private class Vehicle
        {
            public Car MyCar { get; set; }
        }

        private abstract class Car
        {
            public string Type { get; set; }
            public string Color { get; set; }
            public int DoorsNo { get; set; }
        }

        private class SimpleCar : Car { }
        private class FancyCar : Car { }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var car1 = new SimpleCar() { Type = "hatchback", Color = "blue", DoorsNo = 5 };
            var car2 = new SimpleCar() { Type = "sedan", Color = "red", DoorsNo = 4 };
            var car3 = new SimpleCar() { Type = "sedan", Color = "blach", DoorsNo = 4 };

            var car4 = new FancyCar() { Type = "fancy", Color = "white", DoorsNo = 3 };
            var car5 = new FancyCar() { Type = "veryFancy", Color = "yellow", DoorsNo = 3 };

            //myCars.Add(car1);
            //myCars.Add(car2);
            //myCars.Add(car3);

            var vehicle1 = new Vehicle() { MyCar = car1 };
            var vehicle2 = new Vehicle() { MyCar = car2 };
            var vehicle3 = new Vehicle() { MyCar = car3 };

            var vehicle4 = new Vehicle(){MyCar = car4};
            var vehicle5 = new Vehicle(){MyCar = car5};

            myVehicles.Add(vehicle1);
            myVehicles.Add(vehicle2);
            myVehicles.Add(vehicle3);
            myVehicles.Add(vehicle4);
            myVehicles.Add(vehicle5);


            var onlySimpleCars = from vehicle in myVehicles
                                  where (vehicle.MyCar.GetType() == typeof(SimpleCar))
                                  select vehicle.MyCar;

            var allCars = from vehicle in myVehicles
                              select vehicle.MyCar;

            grdMyData.ItemsSource = onlySimpleCars.ToList();
            grdMyData2.ItemsSource = allCars.ToList();
        }
    }
}
private List myCars=new List();
私有列表myVehicles=新列表();
私家车
{
公共汽车MyCar{get;set;}
}
私家车
{
公共字符串类型{get;set;}
公共字符串颜色{get;set;}
public int DoorsNo{get;set;}
}
私有无效按钮\u单击\u 1(对象发送者,路由目标)
{
var car1=新车(){Type=“两厢车”,Color=“蓝色”,DoorsNo=5};
var car2=新车(){Type=“sedan”,Color=“red”,DoorsNo=4};
var car3=新车(){Type=“sedan”,Color=“blach”,DoorsNo=4};
添加(car1);
添加(car2);
添加(car3);
grdMyData.ItemsSource=myCars;
var vehicle1=新车(){MyCar=car1};
var vehicle2=新车(){MyCar=car2};
var vehicle3=新车(){MyCar=car3};
myVehicles.Add(vehicle1);
myVehicles.Add(车辆2);
myVehicles.Add(车辆3);
grdMyData2.DataContext=myVehicles;
}
这是检索汽车列表的最简单方法,还是有更好的选择

    private List<Car> GetVehicleCars()
    {
        var vehicleCars = new List<Car>();

        foreach (Vehicle v in myVehicles)
        {
            vehicleCars.Add(v.MyCar);   
        }
        return vehicleCars;
    }



grdMyData2.ItemsSource = GetVehicleCars();
private List GetVehicleCars()
{
var vehicleCars=新列表();
foreach(我的车辆中的车辆v)
{
车辆卡。添加(v.MyCar);
}
返回车;
}
grdMyData2.ItemsSource=GetVehicleCars();

我想这就是你想要的。只需将其复制并粘贴到WPF应用程序中。 我把代码改了一点,我想你会理解的

请注意,这是非常非常丑陋的代码,您不应该编写这样的代码。我给出了这个丑陋、令人不快的答案,以保持代码与您编写的代码相似

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <DataGrid Grid.Row ="0" x:Name="grdMyData" HorizontalAlignment="Left" VerticalAlignment="Top" />
    <DataGrid Grid.Row ="1" x:Name="grdMyData2" HorizontalAlignment="Left" VerticalAlignment="Top"></DataGrid>
    <Button Grid.Row="2" Click="ButtonBase_OnClick">PRESS ME</Button>
</Grid>

按我
以及背后的代码:

    private List<Car> myCars = new List<Car>();
    private List<Vehicle> myVehicles = new List<Vehicle>();

    private class Vehicle
    {
        public Car MyCar { get; set; }
    }

    private class Car
    {
        public string Type { get; set; }
        public string Color { get; set; }
        public int DoorsNo { get; set; }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        var car1 = new Car(){Type = "hatchback", Color = "blue", DoorsNo = 5};
        var car2 = new Car() { Type = "sedan", Color = "red", DoorsNo = 4 };
        var car3 = new Car() { Type = "sedan", Color = "blach", DoorsNo = 4 };

        myCars.Add(car1);
        myCars.Add(car2);
        myCars.Add(car3);

        grdMyData.ItemsSource = myCars;

        var vehicle1 = new Vehicle() {MyCar = car1};
        var vehicle2 = new Vehicle() {MyCar = car2};
        var vehicle3 = new Vehicle() {MyCar = car3};
        myVehicles.Add(vehicle1);
        myVehicles.Add(vehicle2);
        myVehicles.Add(vehicle3);

        grdMyData2.DataContext = myVehicles;
    }
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        //private List<Car> myCars = new List<Car>();
        private List<Vehicle> myVehicles = new List<Vehicle>();

        private class Vehicle
        {
            public Car MyCar { get; set; }
        }

        private abstract class Car
        {
            public string Type { get; set; }
            public string Color { get; set; }
            public int DoorsNo { get; set; }
        }

        private class SimpleCar : Car { }
        private class FancyCar : Car { }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var car1 = new SimpleCar() { Type = "hatchback", Color = "blue", DoorsNo = 5 };
            var car2 = new SimpleCar() { Type = "sedan", Color = "red", DoorsNo = 4 };
            var car3 = new SimpleCar() { Type = "sedan", Color = "blach", DoorsNo = 4 };

            var car4 = new FancyCar() { Type = "fancy", Color = "white", DoorsNo = 3 };
            var car5 = new FancyCar() { Type = "veryFancy", Color = "yellow", DoorsNo = 3 };

            //myCars.Add(car1);
            //myCars.Add(car2);
            //myCars.Add(car3);

            var vehicle1 = new Vehicle() { MyCar = car1 };
            var vehicle2 = new Vehicle() { MyCar = car2 };
            var vehicle3 = new Vehicle() { MyCar = car3 };

            var vehicle4 = new Vehicle(){MyCar = car4};
            var vehicle5 = new Vehicle(){MyCar = car5};

            myVehicles.Add(vehicle1);
            myVehicles.Add(vehicle2);
            myVehicles.Add(vehicle3);
            myVehicles.Add(vehicle4);
            myVehicles.Add(vehicle5);


            var onlySimpleCars = from vehicle in myVehicles
                                  where (vehicle.MyCar.GetType() == typeof(SimpleCar))
                                  select vehicle.MyCar;

            var allCars = from vehicle in myVehicles
                              select vehicle.MyCar;

            grdMyData.ItemsSource = onlySimpleCars.ToList();
            grdMyData2.ItemsSource = allCars.ToList();
        }
    }
}
命名空间WpfApplication1
{
公共部分类主窗口:窗口
{
//私有列表myCars=新列表();
私有列表myVehicles=新列表();
私家车
{
公共汽车MyCar{get;set;}
}
私家抽象车
{
公共字符串类型{get;set;}
公共字符串颜色{get;set;}
public int DoorsNo{get;set;}
}
私有类SimpleCar:Car{}
私家车:汽车{}
公共主窗口()
{
初始化组件();
}
private void按钮base_OnClick(对象发送方,RoutedEventTarget e)
{
var car1=new SimpleCar(){Type=“hatchback”,Color=“blue”,DoorsNo=5};
var car2=new SimpleCar(){Type=“sedan”,Color=“red”,DoorsNo=4};
var car3=new SimpleCar(){Type=“sedan”,Color=“blach”,DoorsNo=4};
var car4=new FancyCar(){Type=“fancy”,Color=“white”,DoorsNo=3};
var car5=new FancyCar(){Type=“veryfance”,Color=“yellow”,DoorsNo=3};
//添加(car1);
//添加(car2);
//添加(car3);
var vehicle1=新车(){MyCar=car1};
var vehicle2=新车(){MyCar=car2};
var vehicle3=新车(){MyCar=car3};
var vehicle4=新车(){MyCar=car4};
var vehicle5=新车(){MyCar=car5};
myVehicles.Add(vehicle1);
myVehicles.Add(车辆2);
myVehicles.Add(车辆3);
myVehicles.Add(车辆4);
myVehicles.Add(车辆5);
var onlySimpleCars=来自myVehicles中的车辆
其中(vehicle.MyCar.GetType()==typeof(SimpleCar))
选择vehicle.MyCar;
var allCars=来自myVehicles中的车辆
选择vehicle.MyCar;
grdMyData.ItemsSource=仅SimpleCars.ToList();
grdMyData2.ItemsSource=allCars.ToList();
}
}
}

您的第一个网格显示车辆(myCars),但您的网格绑定车辆(myVehicles),但这是一个集合(列表),它在列表中找不到车辆(car)。。。你想在第二个网格中显示什么?几乎是我的“车辆”列表中的所有内容。比如说我可能有很多不同类型的车辆,“车”恰好是其中之一。在这个特定的例子中,我希望看到与我在第一个网格中看到的完全相同的数据。我希望你能理解我的担忧。好吧,但上面的关系表明车辆“有一辆”车,而不是确切的车辆类型。但是,为了继续您的案例,您需要从所有车辆中选择车辆,然后将其绑定为第二个网格的itemssource我如何完成它,从“Vehicle”列表中检索“Car”对象列表的最简单方法是什么,这样我就可以将其分配到网格的item source中。这将是非常有用的知识。我还是个新手。嗨,朱马斯特。这正是我想要的,这是一个很好的解决方案。为什么你说这是丑陋的代码,在我看来,这是非常干净的,我认为这违反了OOP规则。既然你完全回答了这个问题,我将标记为已回答,但是,你能否详细说明你个人不喜欢上面的代码结构,以及你将如何实现它