0

我正在尝试为我的 DTO 对象实现添加/编辑控制。我创建了一个 AddContainerView。AddContainerView 是为 DTO 中的每个字段构造一个视图,因为它的目的是显示添加/编辑的状态和进度(例如参见图片)。

橙色 = 当前视图

灰色 = 尚未尝试

绿色 = 有效条目

红色 = 无效条目

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

我会这样实现它:

  • AddContainerView具有ContentControl当前选定的字段视图和概览控件的元素(带有所有圆圈)
  • AddContainerView连接到一个视图模型,该模型具有一个IAdd名为SelectedField(当前选定的字段视图绑定到该属性)和一个为所有可用字段IEnumerable<IAdd>调用的集合属性(也许是) (overview-circle 控件绑定到它)AllFields
  • IAdd为知道的对象(用于“SelectedField”绑定)提供模板视图AddContainerView- 文本框、复选框、带有标签,你可以命名它......
  • 因为您绑定SelectedField到您的字段控件,所以您始终存储最新的值
  • 每当有人前进或后退(或者甚至可能点击一个圆圈)时,您都会SelectedField使用新选择的属性重置属性
于 2013-09-24T12:10:15.473 回答
0

我最终做的是在 AddContainerViewModel 中创建一个保存方法。

这有一个可用视图列表,每个视图都实现了 IAdd。

在 AddContainerViewModel 的构造函数中,我传递了一个 Type(ObjectType),这是具有每个字段的类型。由于每个 IAdd 都有字段名称,因此我创建一个该类型的新对象,用于根据 IAdd 中的字段名称和值保存和加载该类型的每个属性。

ID 部分有点小技巧,使其也适用于 Edits。我传递了 1 或更大的 ID 表示更新,0 表示添加新的。因为我在数据库中的一个表有 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 回答