我有1年的经验,所以请温柔的对我:) 我目前正在学习MVVM,而我正在关注我在网上找到的一个例子。 我试图定制它来做我想要它做的事情。 我有4个类(模型),处理司机,学生车等 我决定创建一个联系类模型,应该在所有模型中共享。
我有一个DataAccess类,使用以下方法从数据库中读取
public static List<T> ReadList<T>(string sql, Func<IDataReader, T> makeDataObject,
Dictionary<string, object> parms = null)
{
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
using (var command = factory.CreateCommand())
{
command.Connection = connection;
command.CommandText = sql;
command.SetParameters(parms);
connection.Open();
List<T> list = new List<T>();
var reader = command.ExecuteReader();
while (reader.Read())
{
list.Add(makeDataObject(reader));
}
return list;
}
}
}
然后我有一个ModelDao用于数据检索,如下所示
public static List<EscortModel> GetEscorts()
{
//string sql = @"SELECT EscortId, FirstName From tb_Escorts; select * from tb_Addresses ";
string sql = @"SELECT AddressID,EscortId, FirstName From tb_Escorts
inner join tb_Addresses on tb_Escorts.EscortId = tb_Addresses.AddressID ";
return AdoDataAccess.ReadList(sql, MakeDataObject);
}
private static Func<IDataReader, EscortModel> MakeDataObject = reader =>
new EscortModel
{
// AddressesEscort1 = {}
//AddressesEscort1 = { AddressId = reader.GetInt32(302) },
EscortId = Convert.ToInt32(reader["EscortID"]),
FirstName = reader["FirstName"].ToString().Trim(),
}
及以下是包含地址模型的类模型的一部分:
public class EscortModel:ViewModel
{
#region Fields
private int _iEscortId;
private string _sFirstName;
private string _sSurname;
private bool _bCrbCheck;
private string _sCrbRef;
private DateTime _expirayDate;
private bool _bTraining;
private string _sTrainingType;
private Addresses _escAddressesModel;
#endregion Fields
public Addresses AddressesEscort1
{
get { return _escAddressesModel; }
set
{
_escAddressesModel = value;
NotifyPropertyChanged();
}
}
#region Properties
/// <summary>
/// Get or set Escort ID
/// </summary>
public int EscortId
{
get { return _iEscortId; }
set
{
_iEscortId = value;
NotifyPropertyChanged();
}
}
当我尝试访问任何地址属性时,我的问题如下
private static Func<IDataReader, EscortModel> MakeDataObject = reader => New EscortModel
{
EscortModel.Addresses.AddressID = Convert.ToInt32(reader["AddressID"])
}
这就是我遇到问题的地方,因为阅读器只重新设置了EscortModel而不是地址(联系人)。 因为消息会说首先例外 有关如何在EscortModel中访问该地址属性的任何提示 或者无论如何,地址(联系)可以被所有其他模型继续存在,记住我已经viewModel是所有人的iherited 通过所有模型,据我所知,C#不允许多重继承。 谢谢。
答案 0 :(得分:0)
好的,我想我现在明白你的问题了:
看起来你已经模糊了Model和ViewModel之间的界限,这就是导致你混淆的原因。
您的数据对象(本例中为Escort)不应继承自ViewModel(因为它们是Model的一部分)。相反,他们会继承基地&#34;联系人&#34;如你所描述的那样。当然,如果你不是&#34;&#34;类型的&#34;情况,你不应该使用继承。在这种情况下,组合是你需要的。为了减少重复的代码,我将创建一个代表所有常见信息的ContactInfo
类,并让每个类都具有这种新类型的属性。
实际的&#34; ViewModel&#34; (这是每个视图一个类)然后将整理这些对象以供View使用,并且不应包含特定于模型的任何数据。
希望这有帮助,让我知道我是否可以澄清任何事情!