0

DTO オブジェクトの追加/編集コントロールを実装しようとしています。AddContainerView を作成しました。AddContainerView は、DTO の各フィールドのビューで構築されます。その目的は、追加/編集のステータスと進行状況を表示することです (たとえば、pic を参照)。

オレンジ = 現在のビュー

灰色 = 未試行

緑 = 有効なエントリ

赤 = 無効なエントリ

1

各フィールド ビューには、次のようなインターフェイス IAdd があります。

Field は関連付けられたフィールドの名前で、Value は値にバインドするプロパティです。

public interface IAdd
{
    bool IsSelected
    {
        get;
        set;
    }
    bool IsValid
    {
        get;
        set;
    }
    bool Attempted
    {
        get;
        set;
    }
    string Field
    {
        get;
        set;
    }

    object Value
    {
        get;
        set;
    }
}

問題:

これらのビューにはそれぞれ独自のプロパティ (値) があるため、DTO を再作成するか、AddContainerView から参照される DTO を設定する必要があります。

質問: 静的変数やポインターを使用せずにこれを達成する最善の方法は何ですか?

更新: AddContainerView.xaml http://pastebin.com/Jf7XjyjR

AddContainerViewModel: http://pastebin.com/pM2Ye0qx

追加: http://pastebin.com/GZCU0j3z

更新 2 (考えられる解決策):

public void Save()
{
    T tempObject = (T)Activator.CreateInstance(typeof(T));
    Views.ToList().ForEach(v =>
    {
        var cv = (v as IAdd);
        tempObject.GetType().GetField(cv.Field).SetValue(tempObject, cv.Value);
    });
    //Database update...
}
4

2 に答える 2

0

私は次のように実装します:

  • AddContainerViewContentControl現在選択されているフィールド ビューと概要コントロール (すべての円を含む)の要素があります。
  • AddContainerViewIAddと呼ばれるプロパティ(現在選択されているフィールド ビューがそれにバインドされます) と、使用可能なすべてのフィールドに対して呼び出されるSelectedFieldコレクション プロパティ (おそらく)を持つビュー モデルに接続されます (overview-circle コントロールがそれにバインドされます)。IEnumerable<IAdd>AllFields
  • ('SelectedField' バインディング用)IAddを認識しているオブジェクトのテンプレート ビューを用意します - テキストボックス、チェックボックス、ラベル付き、名前を付けます...AddContainerView
  • SelectedFieldフィールド コントロールにバインドするため、常に最新の値が保存されます。
  • 誰かが前後に移動する (または円をクリックする) たびSelectedFieldに、新しく選択したプロパティでプロパティをリセットします
于 2013-09-24T12:10:15.473 に答える
0

私がやったことは、AddContainerViewModel で保存メソッドを作成することでした。

これには、各ビューが IAdd を実装する使用可能なビューのリストがあります。

AddContainerViewModel のコンストラクターで、Type(ObjectType) を渡します。これは、各フィールドを持つ型です。各 IAdd にはフィールド名があるため、その Type の新しいオブジェクトを作成して、IAdd のフィールド名と値に基づいて、そのタイプの各プロパティを保存およびロードします。

ID 部分は、編集でも機能させるためのちょっとしたハックです。更新を示すために 1 以上の ID を渡し、新規追加するには 0 を渡しました。データベース内のテーブルの 1 つに ID ではなく Id があるため、残念ながら両方のプロパティを確認する必要がありました。

var idProp = tempObject.GetType().GetProperty("ID");
if(idProp == null)
    idProp = tempObject.GetType().GetProperty("Id");
if(idProp != null)
    idProp.SetValue(tempObject, ID);

ソリューション:

public void Save()
{
    var tempObject = Activator.CreateInstance(ObjectType);
    var idProp = tempObject.GetType().GetProperty("ID");
    if(idProp == null)
        idProp = tempObject.GetType().GetProperty("Id");
    if(idProp != null)
        idProp.SetValue(tempObject, ID);
    Views.ToList().ForEach(v =>
    {
        var cv = (v as IAdd);
        var f = tempObject.GetType().GetProperty(cv.Field);
        f.SetValue(tempObject, cv.Value);
    });
    //Database update
    SaveHelpers.SaveObject(tempObject);
    Navigator.Nav.Back();
}
于 2013-09-25T05:01:10.913 に答える