【发布时间】:2016-03-07 21:54:08
【问题描述】:
我有一个由属性组成的模型,这个模型在我的视图模型中被引用。
我正在以编程方式更改模型属性的值(从数据库中获取数据)。 当这些值发生变化时,“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;
}
【问题讨论】: