【问题标题】:Call a CodeBehind Method from ViewModel从 ViewModel 调用 CodeBehind 方法
【发布时间】:2021-01-19 12:48:34
【问题描述】:

我正在尝试通过使用 Xamarin.Forms 编写一个小应用程序来学习 MVVM 设计模式。 我保护了 Android 文件系统 (XML) 中的所有数据以使其持久化。但目前所有保护数据的方法都在 ViewModel 中,我正在尝试将这些方法移至 CodeBehind(模型)以尊重 MVVM 设计模式。

将所有方法移至 CodeBehind 后,我无法调用 ViewModel 中的函数,即使它们位于同一命名空间中并声明为公共。

我的 ViewModel 中的方法 DeleteCar(...) 尝试调用 CodeBehind 中的方法 ToCarsFile(...)

public void DeleteCar(object sender)
{
    AllCars.Remove(sender as Car);
    ToCarsFile(AllCars); //This is underlined in red
}

代码隐藏 (.xaml.cs):

public void ToCarsFile(ObservableCollection<Car> CarsList)
{
    --SOME CODE FOR DATA PERSISTENCE--
}

我收到错误“错误 CS0103:名称 'ToCarsFile' 在当前上下文中不存在 (CS0103) (ProjectCars)”

可能是一个愚蠢的错误,但我做错了什么?

【问题讨论】:

  • 为什么您认为将代码移动到代码隐藏是 MVVM 概念的一部分?保存数据当然是您可以在 VM 中执行的操作。您的 VM 不应该在后面调用您的代码的方法,这会破坏 MVVM 主体。最后,您需要一个类实例的引用才能使用它的公共方法。这是基本的 C#
  • @Jason 谢谢你的回答。当我发布这个问题时,我犯了一个错误。我有一个实例......我会更新它。关于 MVVM 概念:我认为 CodeBehind 和模型是相同的,因为模型负责应用程序数据,所以我想将代码的那部分移动到 CodeBehind。似乎我对 MVVM 的理解是我的错误:) 谢谢
  • 后面的代码是视图的一部分。

标签: c# xamarin.forms mvvm viewmodel code-behind


【解决方案1】:

这里发生了很多事情:

第一。由于函数是在类中声明的,所以你需要一个类的实例来调用它

public class SomeModel {
    public void ToCarsFile(ObservableCollection<Car> CarsList)
    {
    --SOME CODE FOR DATA PERSISTENCE--
    }
}

所以要调用它,你需要这样的东西

   var modelObject = new SomeModel();
   modelObject.ToCarsFile(/*data*/);
  1. 您的 xaml.cs 不应该是您的模型。 ViewModel 和 Model 都应该独立于视图(xaml.cs 类是您的视图类)

所以你的 MVVM 接线中有一些东西需要改进

【讨论】:

  • 嗨@Athanasios Kataras,感谢您的快速回答。关于我的“实例错误”:我发布这个问题时犯了一个错误。我会更新的。关于 MVVM:感谢您提供的信息。我将阅读更多文章并修复我的 MVVM。
  • 很高兴为您提供帮助。不要忘记投票/接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多