【问题标题】:c# MVVM wpf design passing data between viewmodel and view methodsc# MVVM wpf design在viewmodel和view方法之间传递数据
【发布时间】:2018-11-16 15:00:54
【问题描述】:

我不确定我是否完全理解了 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);

但是我只是觉得这不是正确的方法,因为它会使设计非常紧密地耦合。我应该如何实现它?

【问题讨论】:

  • 你可以使用Commands
  • @Schwarzie2478 我已经检查了所有答案。我不太了解他们
  • hmm,您不应该在事件处理代码中创建视图模型。您应该在视图的构造函数中创建一个,或者使用 IOC 容器和类似 MVVM 的东西将视图链接到某个视图模型。

标签: c# wpf mvvm


【解决方案1】:

首先确保您的视图模型设置为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
    }
}

如何中继命令 => this link

【讨论】:

    【解决方案2】:

    您必须使用绑定来显示您的用户。 要从视图调用操作,您可以使用命令。它们可以绑定在您的 ViewModel 中。 (Why RelayCommand) 试着考虑测试你的代码。如果您在测试代码中使用您的视图对象,您将面临很多问题。 MVVM 帮助您完全分离视图。如果您严格分离 vm 和 view,您将有一个轻松的单元测试生活。

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 2014-01-30
      • 2013-11-30
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2011-09-05
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多