2017-07-03 80 views
0

要读取的数据是很容易的:如何使用MVVM中的数据?

  1. 视图模型从数据库中获取数据
  2. 视图模型增加了数据的ObservableCollection
  3. 查看绑定列表/ DataGrid中的/ etc到的ObservableCollection

如下:

private readonly ObservableCollection<User> _users 
     = new ObservableCollection<User>(); 

public IEnumerable<User> Users 
{ 
    get { return _users; } 
} 

public ICommand ListUsersCommand 
{ 
     get 
     { 
      return new DoSomething(ListUsers); 
     } 
} 
private void ListUsers() 
{ 
    using (OrtundDbContext db = new OrtundDbContext()) 
    { 
     var Users = db.Users.Where(x => x.Deleted == false); 
     foreach (var u in Users) 
     { 
      if (!_users.Contains(u)) 
      _users.Add(u); 
     } 
    } 
} 

所以这允许bindin g到Users在xaml中,所以假设或多或少应该是可能的。 Window上的控件的更新值可以被发回并在ViewModel中用于更新那里的数据源。

那不是发生了什么不幸的是......

目前,我有以下几点:

<StackPanel DataContext={Binding ViewModels:UserViewModel}"> 
    <Label>Name:</Label> 
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
    <Button Name="btnAdd" Command="{Binding AddUserCommand}" Content="Add User" /> 
</StackPanel> 
// Base model implements INotifyPropertyChanged 
public class UserViewModel : BaseModel 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChangedEvent("Name"); 
     } 
    } 

    public ICommand AddUserCommand 
    { 
     get 
     { 
      return new DoSomething(AddUser); 
     } 
    } 

    public void AddUser() 
    { 
     var User = new User 
     { 
      User.Name = Name // assign values based on properties. 
     }; 

     using (OrtundDbContext db = new OrtundDbContext()) 
     { 
      db.Users.Add(User); 
      db.SaveChanges(); 
     } 
    } 
} 

现在的问题是,当我得到ADDUSER,它似乎的值ViewModel的属性(例如,UserViewModel.Name)都是空的,表单中没有值。

我做错了吗?什么是从UI更新数据源的正确方法?

+0

“UserViewModel.Name”在哪里定义? – Lithium

+0

在ViewModel上。我用属性定义替换了那里的注释 – Ortund

+0

Is Name not firing OnPropertyChanged? – mageos

回答

2

请确保您设置的TextBox或其任何父元素为您调用的命令UserViewModel的实际实例的DataContext

<StackPanel> 
    <StackPanel.DataContext> 
     <local:UserViewModel /> 
    </StackPanel.DataContext> 
    <Label>Name:</Label> 
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
    <Button Name="btnAdd" Command="{Binding AddUserCommand}" Content="Add User" /> 
</StackPanel> 

如果使用上述样品标记和设置在AddUser()方法中的断点,您应该注意到Name属性具有您在TextBox中看到的值。