首页 > 解决方案 > C# MVVM,了解何时不制作模型

问题描述

我大家。

我是 MVVM 的忠实粉丝,但需要澄清我应该如何实现一个可以跨多个视图模型使用的通用方法。

目前我已经在模型中实现了一种方法来拍摄像这样的屏幕截图 EG

界面

public interface ICapture {
 void CaptureMethod();
}

这是实现该接口的模型

public class CaptureModel : ICapture {
    void CaptureMethod(){ //implement the code to take screen shot }
}

现在我想在一个或多个视图模型上执行屏幕截图,所以我需要像这样实例化并调用函数。

public ViewModel(){
 void TakeScreenShotMethodOrCommandDontCare(){
   ICapture captureClass = new CaptureClass();
   captureClass.captureMethod
  }
}

这只是感觉错误,必须实例化一个对象的实例才能调用一个将截屏的函数。

我想我可以进入视图模型并使用捕获屏幕截图方法,但这会导致所有具有该功能的视图模型的代码重复。

也许是一个静态实用程序类,但在应用程序上肯定会很昂贵。

我觉得如果我有一个由基类实现的接口,那么我的视图模型可以从该基类继承并在我想要的任何视图模型上实现基本实现。

所以总结一下我的问题,如果你想实现一个捕获屏幕截图的方法并且你喜欢 mvvm 那么你会在哪里实现呢?

再次感谢所有花时间为我阐明这一点的人。

标签: c#mvvm

解决方案


这实际上是我在 MVVM 标准中所考虑的。在处理 MVVM 时,我发现最好这样考虑。您的 View 应该只知道您的 ViewModel,而 ViewModel 应该对 View 一无所知。ViewModel 应该知道您的模型(或模型),但模型不应该知道 ViewModel 或 View。

因此,这里您的模型正在 ViewModel 中实例化,这是完全有效的!在这种情况下,您的模型是 CaptureClass 并且 ViewModel 知道它可以从中获取一个字符串并将其提供给可能想要使用它的某些视图。

模型:

class CaptureClass : ICapture
{       
  public string CaptureShot()
  {
     string s = DependencyService.Get<ICapture>().CaptureShot();
     return s;
  }      
}

视图模型:

public class CaptureViewModel(){

   private _captureText;

   public CaptureText
   {
       get{ return _captureText; }
       set{
           _captureText = value;
       }
   }

   public CaptureViewModel()
   {
       CaptureClass cc = new CaptureClass();
       _captureText = cc.CaptureShot();
   }
}

现在您所要做的就是将它连接到您的视图。请记住,视图知道要绑定到哪个属性,因此只需在后面的代码或 XAML 中设置 DataContext,然后在 XAML 中绑定属性,如下所示:

<Label Content="{Binding CaptureText}" />

推荐阅读