派生类的ObservableCollection

时间:2017-07-22 11:52:12

标签: c# wpf entity-framework class observablecollection

我是C#的初学者(来自SQL背景),所以这个问题中的一些术语可能不正确......提前出现。

我正在尝试使用C#/ WPF / SQLite创建食物消费跟踪应用程序(允许您跟踪您吃的食物,计算卡路里等)。 我已经使用EF中的添加模型向导创建了数据库部分和实体模型。

我有一个ConsumerLog实体,就像这样

public partial class ConsumptionLog
{
    public int consumptionID { get; set; }
    public Nullable<int> dayMealNumber { get; set; }
    public Nullable<int> foodID { get; set; }
    public Nullable<int> mealID { get; set; }
    public Nullable<decimal> servings { get; set; }
    public System.DateTime logDate { get; set; }

    public virtual Meal Meal { get; set; }
    public virtual Food Food { get; set; }


}

public partial class Food
{
    public Food()
    {
        this.ConsumptionLogs = new HashSet<ConsumptionLog>();
        this.MealContents = new HashSet<MealContent>();
    }

    public int foodID { get; set; }
    public string store { get; set; }
    public string brandName { get; set; }
    public string foodName { get; set; }
    public string foodUnit { get; set; }
    public Nullable<decimal> foodNoOfUnits { get; set; }
    public Nullable<decimal> calories { get; set; }
    public Nullable<decimal> carb { get; set; }
    public Nullable<decimal> sugar { get; set; }
    public Nullable<decimal> protein { get; set; }
    public Nullable<decimal> fat { get; set; }
    public Nullable<decimal> fibre { get; set; }
    public Nullable<decimal> gms { get; set; }
    public Nullable<decimal> ml { get; set; }
    public short isActive { get; set; }
    public virtual ICollection<MealContent> MealContents { get; set; }
}

以上代码是自动生成的。我想要做的是将ComsumptionLog扩展到另一个类中,以添加更多属性。例如,这是一个片段......

    public partial class ConsumptionLogView : ConsumptionLog
{
    public ObservableCollection<ConsumptionLogView> CLViewList { get; set; }

    string _FoodName;
    public string FoodName
    {
        get
        {
            if (Food == null)
            {
                return "Total";
            }
            else
            {
                return Food.foodName.ToString() + " : " 
                    + Convert.ToDouble(Food.foodNoOfUnits).ToString() + " " + Food.foodUnit.ToString();
            }
        }
        set
        {

        }
    }

    public decimal _Calories;
    public decimal Calories
    {
        get
        {
            if (Food == null)
            {
                return _Calories;
            }
            else
            {
                return Convert.ToDecimal(Food.calories);
            }
        }
        set
        {

        }
    }
}

我的目标是,我可以使用这样的东西

private void LoadConsumptionLogs()
    {
        FitnessLogDBEntities ctx = new FitnessLogDBEntities();
        var consumptionList = (
                                    from s in ctx.ConsumptionLogs
                                    where s.logDate == LogDate.SelectedDate.Value
                                    select s).ToList<ConsumptionLog>();

        ObservableCollection<ConsumptionLogView> conLogViewColl = 
            (ObservableCollection<ConsumptionLogView>)consumptionList.Cast<ObservableCollection<ConsumptionLogView>>();

        var consumptionItem = new ConsumptionLogView();
        consumptionItem._Calories = GetTotalCals(conLogViewColl);
        conLogViewColl.Add(consumptionItem);
        ConsumptionLog.ItemsSource = conLogViewColl;
    }

private decimal GetTotalCals(ObservableCollection<ConsumptionLogView> cons)
    {
        double Total = 0;
        foreach (ConsumptionLogView con in cons)
        {
            Total += Convert.ToDouble(con.Calories);
        }
        return Convert.ToDecimal(Total);
    }

显然,这不起作用,并且正在尝试将基类ObservableCollection(ConsumptionLog)强制转换为派生类(ConsuLogView)

我的问题是:

  1. 当我只有基类并用它修改时,代码正在工作 代码的总卡路里部分。只有那个,如果在那一点,如果 我稍微修改了数据库结构,并在VS中刷新了 类和代码被覆盖。所以我开始走这条路了 分开附加代码。我试图做错了 这样的事情(在课堂上分开代码)?
  2. 如果没有,我是否会尝试填充基类obs。科尔。并且正在进行&#34;复制&#34;将集合内容导入派生类obs。采集?我认为,因为ConsuLogView具有所有消费+一些,我将能够投射它。
  3. 我搜索了SO和其他地方但是不确定要搜索的内容,所以任何帮助都会受到赞赏。如果有指向其他工作示例的指针,那也是我可以开始的地方。

    提前致谢, 小号

1 个答案:

答案 0 :(得分:0)

您不一定要使用继承来扩展类。在C#中扩展类的第二种方法是使用部分类。这意味着一个类由多个文件组成。通常,自动生成的类已经是部分的。这意味着扩展课程非常简单。假设代码生成器创建了 ComsumptionLog.cs (请注意partial标识符)

public partial class ConsumptionLog
{
    //Some properties
}

您只需创建第二个文件,例如 ComsumptionLogExtension.cs

public partial class ConsumptionLog
{
    //Additional properties and methods
}

包含您需要的所有其他属性和方法。有关更多信息,请查看Microsofts description of partial classes。这样您就不需要转换任何类型,因为类仍然是相同的。如果将扩展文件保存在与生成的文件不同的文件夹中,则代码生成器在生成运行期间不应触摸它。请注意,命名空间必须相同。

我认为这种方法应该以非常简洁的方式解决您的问题。