如何处理 MVVM 中的数据?

放置和

读取数据很容易:

  1. ViewModel 从数据库中获取数据
  2. ViewModel 将数据添加到 ObservableCollection
  3. 视图将 List/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);
        }
    }
}

因此,这允许绑定到Usersxaml 中,因此假设或多或少应该可以进行反向操作似乎是合乎逻辑的。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 更新数据源的正确方法是什么?

毫米8

确保将DataContextTextBox或其任何父元素设置为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.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章