如何使用MVVM中的数据?

时间:2017-07-03 13:16:07

标签: c# wpf mvvm

阅读数据很简单:

  1. ViewModel从数据库中获取数据
  2. ViewModel将数据添加到ObservableCollection
  3. View将List / DataGrid / etc绑定到ObservableCollection
  4. 如下:

    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);
            }
        }
    }
    

    因此,这允许在xaml中绑定到Users,因此似乎合乎逻辑地假设反转应该或多或少。可以发送回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更新数据源的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

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

<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中看到的值。