从不同视图重建对象的最佳方法是什么?

时间:2013-09-24 11:06:51

标签: c# wpf mvvm

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

橙色=当前视图

格雷=尚未尝试

绿色=有效输入

红色=无效条目

1

每个字段视图都有IAdd接口,如下所示:

字段是关联字段的名称,而Value是要为值

绑定的属性
public interface IAdd
{
    bool IsSelected
    {
        get;
        set;
    }
    bool IsValid
    {
        get;
        set;
    }
    bool Attempted
    {
        get;
        set;
    }
    string Field
    {
        get;
        set;
    }

    object Value
    {
        get;
        set;
    }
}

问题:

因为每个视图都有自己的属性(Value),我需要重新创建DTO或者从AddContainerView设置引用的DTO。

问题: 没有静态变量或指针的最佳方法是什么?

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

AddContainerViewModel: http://pastebin.com/pM2Ye0qx

IADD: 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...
}

2 个答案:

答案 0 :(得分:0)

我会像这样实现它:

  • AddContainerView有一个ContentControl元素用于当前选定的字段视图和概览控件(包含所有圆圈)
  • AddContainerView与视图模型连接,该视图模型具有名为IAdd的{​​{1}}属性(当前选定的字段视图绑定到该属性)和集合属性(可能SelectedField )为所有可用字段调用IEnumerable<IAdd>(概述圆控件绑定到它)
  • 拥有AllFields知道的IAdd对象的模板视图(用于'SelectedField'绑定) - 文本框,复选框,带标签,您为其命名...
  • 由于您将AddContainerView绑定到字段控件,因此始终存储最新值
  • 每当有人前进或后退(或者甚至可能点击一个圆圈)时,您都会使用新选择的
  • 重置SelectedField属性

答案 1 :(得分:0)

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

这里有一个每个视图实现IAdd的可用视图列表。

在AddContainerViewModel的构造函数中,我传递一个Type(ObjectType),这是包含每个字段的类型。当每个IAdd具有字段名称I然后创建该类型的新对象以保存并基于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();
}