如何组合两个不同类中的信息以在ListBox中显示结果?

时间:2015-06-04 07:21:06

标签: c# wpf listbox

我的程序包含两个不同的类。我想合并两者的值,只是为了在ListBox中显示结果信息。信息存储在数据库中,我的代码中的类是由LINQ to SQL DataClass创建的。

头等(ReactorParameters)

该类包含有关特定时间反应堆的信息,如火焰温度,油量,空气量......

班级定义:

public class ReactorParameters
{
    public TimeSpan Time
    { get; set; }

    public double Temperature
    { get; set; }

    public double Oil
    { get; set; }

    public double Air
    { get; set; }
}

示例数据:

ReactorParameters sample data

第二课(ProductInformation)

ProductInformation类存储有关反应堆在哪个时间段生产的产品的信息。

班级定义:

public class ProductInformation
{
    public TimeSpan Time_From
    { get; set; }

    public TimeSpan Time_To
    { get; set; }

    public Product Product
    { get; set; }
}

示例数据:

ProductInformation sample data

我希望结果如何?

我想要实现的是将反应器参数与在给定时间生产的产品结合起来。

The combined data

这是一项简单的任务。你为什么要问?

当然,我可以创建一个新类,为每个ReactorParameters创建一个实例,并在其中存储相关的Product。但由于这只是出于用户界面的目的(我不需要额外的课程),我不确定是否有更好的方法来实现目标。我听说过CompositeCollectionCollectionView,但我不确定这对我有用。

那么,有没有其他方法可以填充我的ListBox

2 个答案:

答案 0 :(得分:1)

在我看来,我应该去一个包含这些类作为属性的新类。这种方式允许您在需要更多属性的情况下进行扩展。

public class ProductReactorModel
{
    public ReactorParameters ReactorParameters {get;set;}
    public ProductInformation ProductInformation {get;set;}
}

然后创建新创建的类List<ProductReactorModel>的列表。将此列表绑定到ListBox。使用此类,您可以访问要在ListBox中显示的类和属性。在ListBox中以下列方式绑定。

{Binding ReactorParameters.Time}

答案 1 :(得分:1)

您必须创建视图类来绑定它。

尝试以下代码(我将Product替换为string进行测试):

public class ReactorParameters
{
    public TimeSpan Time { get; set; }

    public double Temperature { get; set; }

    public double Oil { get; set; }

    public double Air { get; set; }
}

public class ProductInformation
{
    public TimeSpan Time_From { get; set; }

    public TimeSpan Time_To { get; set; }

    public string Product { get; set; }
}

public class ReactorView
{
    public ReactorParameters Parameters { get; set; }
    public ProductInformation Product { get; set; }
}

/// <summary>
/// entry point
/// </summary>
public void Test()
{
    Random rnd = new Random(1000);

    // random parameters
    List<ReactorParameters> parameters = (from i in Enumerable.Range(0, 24)
                                          select new ReactorParameters
                                          {
                                              Time = TimeSpan.FromHours(i),
                                              Temperature = rnd.NextDouble() * 50.0,
                                              Oil = rnd.NextDouble() * 20.0,
                                              Air = rnd.NextDouble() * 30.0,
                                          }).ToList();

    // product information
    List<ProductInformation> products = (from i in Enumerable.Range(0, 4)
                                         select new ProductInformation
                                         {
                                             Time_From = TimeSpan.FromHours(i * 6),
                                             Time_To = TimeSpan.FromHours(i * 6 + 6),
                                             Product = "Product " + (char)('A' + i),
                                         }).ToList();


    // combine
    var result = parameters.SelectMany(param => from product in products
                                                where param.Time >= product.Time_From && param.Time <= product.Time_To
                                                select new ReactorView
                                                {
                                                    Parameters = param,
                                                    Product = product
                                                });

    // alternative query
    var resultAlt = from param in parameters
                 from product in products
                 where param.Time >= product.Time_From && param.Time <= product.Time_To
                 select new ReactorView
                 {
                     Parameters = param,
                     Product = product
                 };

    // print result
    foreach (var item in result)
    {
        Console.WriteLine("{0,-5} {1,-8:0.00} {2,-8:0.00} {3,-8:0.00} {4,-10}",
            item.Parameters.Time, item.Parameters.Temperature, item.Parameters.Air, item.Parameters.Oil, item.Product.Product);
    }
}