2016-12-24 16 views
0

Trynig到的DataContext設置爲WPF窗口我使用CodeFirst這裏是代碼WPF窗口的DataContext錯誤「無效列名」

public class Employee 
{ 
    [Key] 
    public int EmployeeId { get; set; } 

    [Display(Name = "FullName")] 
    [Required(ErrorMessage = "FullNameRequired")] 
    public string FullName { get; set; } 

    public string Address { get; set; } 

    public string Phone { get; set; } 

    public double Salary { get; set; } 

    public string Email { get; set; } 

    public string Job { get; set; } 

} 

public class EmployeeVM 
{ 
    SDBContext db = new SDBContext(); 

    public List<Employee> Employees; 

    public EmployeeVM() 
    { 
     this.Employees= db.Employees.ToList(); 
    } 
} 

添加視圖模型到窗口的DataContext

xmlns:VM="clr-namespace:Project_Test.ViewModels" 

<Window.DataContext> 
    <VM:EmployeeVM/> 
</Window.DataContext> 

但我得到錯誤「無效的列名作業」

和我試圖綁定'員工'收集到DataGrid,但它沒有工作

ItemsSource="{Binding Employees}" 

完成,在隱藏代碼,它工作正常

SDBContext db = new SDBContext(); 
public MainWindow() 
{ 
    InitializeComponent(); 

    DG_Employees.ItemsSource = db.Employees.ToList(); 
} 

更新

我刪除屬性「工作」,並得到了另一個錯誤: 「的模式支持背景自上改變數據庫已創建。考慮使用代碼第一」

回答

0

如果您第一次的工作方式,你Employees必須是財產,不是野外,像這樣:

public class EmployeeVM 
{ 
    SDBContext db = new SDBContext(); 

    public List<Employee> Employees {get;set;} 

    public EmployeeVM() 
    { 
     this.Employees= db.Employees.ToList(); 
    } 
} 

然後,當您綁定的ItemsSource你的員工就應該工作

不過。

如果計劃裝載員工從數據庫除了costructor的地方,你EmployeeVMshould implement INotifyPropertyChangedEmployees屬性應該提高PropertyChanged事件上的變化,所以你的視圖模型應該是這樣的:

public class EmployeeVM : INotifyPropertyChanged 
{ 
    SDBContext db = new SDBContext(); 

    private List<Employee> _employees; 
    public List<Employee> Employees 
    { 
     get { return _employees; } 
     set 
     { 
      if (Equals(value, _employees)) return; 
      _employees = value; 
      OnPropertyChanged("Employees"); 
     } 
    } 

    public EmployeeVM() 
    { 
     this.Employees = db.Employees.ToList(); 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

然後,每次你做你的this.Employees = /..something../綁定的DataGrid中應該看到的ItemsSource時間而改變。

但甚至更多,如果你打算讓用戶添加/ DataGrid中刪除Employees或以其他方式修改Employees集合,你應該改變從List<Employee>Employees物業類型ObservableCollection<Employee>,然後你的視圖(如DataGrid中)應該得到每當新員工將被移除或添加到Employees集合時發生的事件。

還有更多,如果你打算改變像FullName等員工的屬性,並希望可以通過視圖注意到這些變化(如DataGrid中更新對應Eployee的FullName後的細胞被改變)你的Employee類,反過來,應執行INotifyPropertyChanged太 - 但更好的是,你更不用說Employee,它是Model的一部分,並從數據庫加載併爲Employee類創建單獨的視圖模型。

我必須添加,如果你的任務只是在ViewModel構造中只加載來自數據庫的員工,讓他們查看,只讀,沒有版本,更新或刪除,你可以省略上面所有的麻煩,但我認爲這是一種罕見的情況。