我有一个由属性组成的模型,该模型在我的视图模型中被引用。模型在视图模型中为null
我正在以编程方式更改模型属性的值(从数据库中获取数据)。 更改这些值后,会按照预期在模型内触发“OnPropertyChanged”事件。
但是,我的观点并没有被更新这些更改。
调试我的视图模型显示模型为空。
对于MVVM来说很新,并且已经遵循了一段时间的教程,但似乎无法弄清楚这一点。
我的代码如下(省略不相关部分)
型号
class User : INotifyPropertyChanged
{
private int _ID;
private string _FirstName;
private string _SurName;
private string _Email;
private string _ContactNo;
public string FirstName
{
get
{
return _FirstName;
}
set
{
_FirstName = value;
OnPropertyChanged("FirstName");
}
}
#region INotifyPropertyChanged Members
private event PropertyChangedEventHandler PropertyChangedEvent;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChangedEvent += value; }
remove { PropertyChangedEvent -= value; }
}
protected void OnPropertyChanged(string prop)
{
if (PropertyChangedEvent != null)
PropertyChangedEvent(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
视图模型(不认为我需要改变性质的东西在这里,但把它放在反正只是在情况下)
class MainWindowVM : INotifyPropertyChanged
{
public User UserModel { get; set; }
public MainWindowVM()
{
var test = UserModel.FirstName;
}
#region INotifyPropertyChanged Members
private event PropertyChangedEventHandler PropertyChangedEvent;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChangedEvent += value; }
remove { PropertyChangedEvent -= value; }
}
protected void OnPropertyChanged(string prop)
{
if (PropertyChangedEvent != null)
PropertyChangedEvent(this, new PropertyChangedEventArgs(prop));
}
#endregion
}
查看
<Window x:Class="ProjectName.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ProjectName.ViewModels">
<Window.DataContext>
<vm:MainWindowVM/>
</Window.DataContext>
<Grid Style="{DynamicResource ResourceKey=MainGrid}">
<Label Content="Logged in as:" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="0,0,200,0"/>
<Label Content="{Binding Path=UserModel.FirstName}" HorizontalAlignment="Right" VerticalAlignment="Top" Padding="0,0,150,0"/>
</Grid>
</Window>
用户模型这里
public bool Login(string email, string password)
{
var userOb = new Models.User(); // new instance of user object
using (SqlConnection con = new SqlConnection(FactoryManager.Properties.Resources.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("usp_login", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = email;
con.Open();
cmd.ExecuteNonQuery();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
string dbHash = null;
while (dr.Read())
{
dbHash = dr[1].ToString(); // get db hash value from reader
}
// if password hash matched DB then log in
if (Encryption.ValidatePassword(password, dbHash))
{
con.Close();
GetUser(userOb, email); // gets the current user
return true; // logged in
}
else
{
return false;
}
}
else
{
return false; //invalid login
}
}
}
}
// gets the logged in user and populates the user object, returns this
public Models.User GetUser(Models.User userOb, string email)
{
using (SqlConnection con = new SqlConnection(FactoryManager.Properties.Resources.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("usp_getUser", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@email", SqlDbType.VarChar).Value = email;
con.Open();
cmd.ExecuteNonQuery();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
userOb.ID = Int32.Parse(dr[0].ToString());
userOb.FirstName = dr[1].ToString();
userOb.SurName = dr[2].ToString();
userOb.Email = dr[3].ToString();
userOb.ContactNo = dr[4].ToString();
//Password = dr[4].ToString();
//loginAttempts = dr[5].ToString();
}
// GET ALLOCATED LINES AND POPULATE THE OBJECT
}
else
{
return null; //invalid login
}
}
}
return userOb;
}
但是,然后在VM中初始化新模型将重置所有属性,在显示视图之前更新属性 – DNKROZ
您在哪里设置UserModel属性?你可以把它粘贴到你的文章中吗?通常这些是通过构造函数注入,属性注入,在视图模型本身(例如服务调用)中简单地从视图模型新增的位置(这里不是这种情况)设置的。这些现在想起来了。我在这里没有看到这些。 –
更新我的问题..对不起任何不相关的代码 – DNKROZ