【问题标题】: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
相关资源
最近更新 更多