阅读数据很简单:
如下:
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更新数据源的正确方法是什么?
答案 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
中看到的值。