我不确定我是否完全理解MVVM设计背后的想法,特别是关于从viewmodel
->
view
传递数据,反之亦然。
例如,假设我有一个具有这些属性的模型(尽可能简单(:
public class User{
public string username {get; set;}
public string password {get; set;}
}
这是我的ViewModel
,它有一个登录方法:
// dependency injection
private readonly Context _context;
public constructor(Context context)
{
_context = context;
}
// my method to verify login:
public async Task<bool> login(string username, string password)
{
// fetching data
var user = await _context.Users.FirstOrDefaultAsync(p => p.username== username&& p.Password == password);
return (user != null);
}
所以我的问题是:我应该如何将这些方法传递到视图类?
我通常只是在button_click()
:中这样做
Var viewmodel = new Viewmodels.User();
login_state = viewmodel.login(email, password);
然而,我只是觉得这不是正确的方式,因为这会使设计紧密结合。我应该如何实施它?
首先确保您的视图模型设置为DataContext
或可从中访问。
public SomeView(SomeViewModel vm)
{
DataContext = vm;
InitializeComponent();
}
现在您的视图模型可以从XAML访问:
<Button Command="{Binding LoginCommand}">
在视图模型中创建命令:
class SomeViewModel
{
private readonly Context _context;
public SomeViewModel(Context context)
{
_context = context;
}
public ICommand LoginCommand => new RelayCommand(LoginAndStuff);
private void LoginAndStuff(object param)
{
// do stuff here
}
}
如何放松通信=>此链接
您必须使用绑定来显示用户。对于从视图中调用操作,可以使用命令。它们可以绑定到ViewModel中。(为什么轻松通信(试着考虑测试你的代码。如果您在测试代码中使用视图对象,您将面临许多问题。MVVM可帮助您完全分离视图。如果你严格地将vm和view分开,你将有一个简单的单元测试生活。