【发布时间】:2017-08-21 05:33:46
【问题描述】:
我在我的 XAML 中绑定一个按钮来更新我的数据库中的用户。我想仅在对 ViewModel 上的属性进行更改后才使用 CanExecute 启用按钮。
我正在使用实体框架和 WCF 数据服务来执行我的 CRUD 操作。
模型类
public virtual DbSet<user> users { get; set; }
...
namespace pk.Data
{
using System;
using System.Collections.Generic;
public partial class user
{
public user()
{
this.private_account = new HashSet<private_account>();
}
public int id { get; set; }
public string username { get; set; }
public int superuser { get; set; }
public int enabled { get; set; }
public virtual ICollection<private_account> private_account { get; set; }
}
}
WCF 服务
public class pkService
{
// getUsers() -
// Get all users from the database
[OperationContract]
public IEnumerable<user> getUsers()
{
using (var context = new pkEntities())
{
// Needed in order to handle EF objects with Hashes
context.Configuration.ProxyCreationEnabled = false;
// Pull entity object fom DB
var results = context.users.ToList();
// Detatch from Entity Model
results.ForEach(e => context.Entry(e).State = EntityState.Detached);
//Return detached object
return results;
}
}
// updateUser(user) -
// Update user in the DB
[OperationContract]
public void updateUser(user user){
using (var context = new pkEntities())
{
context.Configuration.ProxyCreationEnabled = false;
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
}
}
}
查看模型#
public class HomeViewModel: ViewModelBase
{
// HomeViewModel()
// Class Constructor
public HomeViewModel()
{
this.RefreshUsers();
userListClick = new RelayCommand<SelectionChangedEventArgs>(_userListClick);
saveUser = new RelayCommand(saveUser);
}
// users
// list of all users in the system
private IEnumerable<user> _users;
public IEnumerable<user> users
{
get { return this._users; }
set
{
this._users = value;
this.RaisePropertyChanged("users");
}
}
// selected user
// currently selected user
private user _selectedUser;
public user selectedUser
{
get { return this._selectedUser; }
set
{
if (this._selectedUser != value)
{
this._selectedUser = value;
this.RaisePropertyChanged("selectedUser");
}
}
}
// RefreshUsers()
// Method for retrieving users from DB
private void RefreshUsers()
{
this._pkServiceClient.getUsersCompleted += (s, e) =>
{
this.users = e.Result;
};
this._pkServiceClient.getUsersAsync();
}
// serverListClick
public ICommand userListClick { get; private set; }
private void _userListClick(SelectionChangedEventArgs e)
{
ListView userList = (ListView)e.Source;
_selectedUser = (user)userList.SelectedItem;
this.setUserDetailsVisible(Visibility.Visible);
this.RaisePropertyChanged("selectedUser");
}
public ICommand saveUser { get; private set; }
private void _saveUser()
{
this._pkServiceClient.updateUser(_selectedUser);
}
}
}
我相信可以绑定 RelayCommand(saveUser, someCommand) 并让 someCommand 返回一个值,我可以在我的 XAML 中绑定到该值来控制启用状态我的按钮。
我似乎找不到使用 Entity Generated 类来处理这个问题的方法。任何帮助都会很棒。
【问题讨论】:
标签: c# entity-framework mvvm mvvm-light