2017-07-22 3 views
0

私はC#の初心者の開発者です(SQLの背景から来ています)ので、この質問の用語のいくつかは間違っている可能性があります。派生クラスのObservableCollection

私はC#/ WPF/SQLiteを使用して、食品消費追跡アプリケーションを作成しようとしています(あなたが食べた食事やカロリーなどを追跡することができます)。 EFでAdd-Modelウィザードを使用して、DatabaseピースとEntityモデルを作成しました。

Iは、上記のコードが自動生成されたので

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; } 
} 

ように、ConsumptionLogエンティティを有します。私がしようとしているのは、ComsumptionLogを別のクラスに拡張して、プロパティを追加することです。たとえば、これは...私は明らかに、これが動作していないと私時点でアップトリップれるこの

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); 
    } 

のようなものを使用することができることを目指して

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 
     { 

     } 
    } 
} 

スニペットです派生クラスに基本クラスのObservableCollection(ConsumptionLog)をキャストしようとしています(ConsumptionLogView)

私の質問をした:

  1. コードは基本クラスしかなく、コードの合計カロリー部分が で修正されました。その時点で、 データベース構造を少し修正してVSでリフレッシュすると、 のクラスとコードが上書きされました。だから私は というこの道を歩み始め、追加コードを分離しました。私は間違って何をしようとしています (クラスのコードを分ける)のような何か?
  2. もしそうでなければ、私は基本クラスobsを設定しようとしています。 coll。コレクションの内容を派生クラスobsに「コピー」することになります。コレクション?私はConsumptionLogViewにConsumption +のすべてがあるので、私はそれをキャストできると思った。

私はSOなどの場所を検索しましたが、何を検索するのか正確には分からなかったので、助けていただければ幸いです。他の作業例へのポインタがあれば、それは私が始めることができる場所でもあります。事前に

おかげで、 S

+0

'ConsumptionLog'は、あなたがシンプルに拡張できる部分クラスです。継承を使用する代わりに既存のクラスを拡張することを考えましたか?これはあなたの問題を解決する可能性があります。 – Fruchtzwerg

+0

実際、ConsumptionLogのコードは、Add New Modelウィザード(edmx)を使用したときに自動的に作成されました。最初のアプローチは、(1)で述べたように、このクラスを拡張することでしたが、基盤となるDB構造を変更し、Visual Studioで 'データベースからモデルをリフレッシュ'した場合、このクラスは上書きされ、私は再びすべての変更を書き直さなければならなかった。私は一つの解決策はリフレッシュしないことだと思いますが、それは私にはハイリスクのアプローチのようです。 –

+1

部分クラスを2番目のファイルで拡張することができます。これが、ほとんどの自動生成されたクラスが部分的な理由です。これは、変更がジェネレータによって上書きされない別のファイルにあることを意味します。 – Fruchtzwerg

答えて

0

あなたはクラスを拡張するために継承を使用することは必ずしも必要はありません。 C#でクラスを拡張する2番目の方法は、部分クラスを使用しています。これは、クラスが複数のファイルで構成されていることを意味します。通常、自動生成されたクラスはすでに部分的です。つまり、クラスを拡張することは非常に簡単です。あなたが唯一のComsumptionLogExtension状の第2のファイルを作成する必要が

public partial class ConsumptionLog 
{ 
    //Some properties 
} 

partial識別子に注意してください)のコード・ジェネレータはComsumptionLog.csを作成したとしましょう。cs

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

さらに必要なプロパティとメソッドがあります。詳細はMicrosofts description of partial classesをご覧ください。クラスがまだ同じなので、このようにタイプをキャストする必要はありません。拡張ファイルを生成されたファイルとは別のフォルダに保存すると、コードジェネレータは生成実行中にコードジェネレータに触れてはなりません。名前空間は同じでなければならないことに注意してください。

私はこのアプローチが非常にクリーンで簡単な方法であなたの問題を解決すべきだと思います。

関連する問題