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规则。既然你完全回答了这个问题,我将标记为已回答,但是,你能否详细说明你个人不喜欢上面的代码结构,以及你将如何实现它