我正在为我的DTO对象尝试实现添加/编辑控件。 我创建了一个AddContainerView。 AddContainerView构造为DTO中每个字段的视图,因为它的目的是显示添加/编辑的状态和进度(例如参见图片)。
橙色=当前视图
格雷=尚未尝试
绿色=有效输入
红色=无效条目
每个字段视图都有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...
}
答案 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();
}