我不确定为什么我在XAML中定义的属性没有在ViewModel中公开?这是我当前的应用程序:使用带有Entity Framework 6.0的MVVM模式创建一个WPF 4.5项目。
当我尝试在Save()上创建一个新对象时,比如说Employee,我在EmployeeViewModel中实例化一个带有一些默认值的Employee对象,例如:
C#
public class EmployeeViewModel
{
private Employee _employee;
public Employee Employee
{
get
{
return _employee;
}
set
{
_employee = value;
RaisePropertyChanged("Employee");
}
}
public EmployeeViewModel()
{
Employee = new Employee();
Employee.HireDate = DateTime.Now;
...
}
}
XAML:
...
<TextBox Text="{Binding Employee.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Employee.LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Employee.Salary, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
...
我从上面的XAML中知道Path,例如&#34; Employee.FirstName&#34;正在寻找那些属性,因为我没有得到警告,注意到它无法弄清楚Employee是什么。仅供参考,我为此XAML设置了DataContext,如下所示:
DataContext="{Binding Path=EmployeeViewModel, Source={StaticResource Locator}}">
虽然我没有明确设置ViewModel中的FirstName,LastName等员工属性,但它们是否仍然应该通过ViewModel中的Employee的公共属性进行设置?
我还在Employee类中定义的属性上设置了一些断点,这些属性位于我的Entity Framework Code First定义的位置,而且没有被命中。
因此,当我输入数据然后单击Save按钮调用EmployeeViewModel中的Save方法时,通过表格将Employee对象作为参数,我可以看到Employee对象没有任何属性设置假设来自XAML,我看到的唯一属性是我最初通过ViewModel的构造函数设置的属性。
我错过了什么?
编辑1:
这是我的Save方法,这是我调查Employee对象的地方,它具有与通过EmployeeViewModel构造函数实例化时相同的属性:
public void Save()
{
AddEmployee(Employee);
}
我很确定它与构造函数中的Employee对象相同,因为它上面有TimeStamps。
编辑2:
我的Employee类是在一个基本上是EF Code First项目的项目中定义的。这是我班级的一部分:
[Table("Employee")]
public partial class Employee
{
public Employee()
{
Projects = new ICollection<Project>();
}
public int EmpId{ get; set; }
[StringLength(50)]
public string FirstName { get; set; }
...
答案 0 :(得分:2)
在您的员工类中实现INotifyPropertyChanged :(绑定在您的Employee的属性上,在更新属性时不会收到通知)
[Table("Employee")]
public partial class Employee : INotifyPropertyChanged
{
public Employee()
{
Projects = new ICollection<Project>();
}
private int _empId;
public int EmpId
{
get
{
return _empId;
}
set
{
_empId = value;
NotifyPropertyChanged("EmpId");
}
}
private string _firstName;
[StringLength(50)]
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
NotifyPropertyChanged("FirstName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
<强>更新强>
尝试阅读本文,它可能具有在WPF中绑定数据库对象的本机方式。 here