【问题标题】:How do you perform complex operations on the view from the view model?如何从视图模型对视图执行复杂的操作?
【发布时间】:2014-04-08 23:50:03
【问题描述】:

我正在使用 MVVM,并且我的 WPF 前端中嵌入了一个 3D 视图。我想在这个视图上执行一些操作,比如explode、unexplode 和home。我在视图上有执行这些操作的函数(即Explode(amount)Unexplode()Home()),但是如何从视图模型传达我想要做的事情?

【问题讨论】:

  • 查看my answer 的类似问题。 --编辑:-- 我刚刚意识到你也问过这个问题:P
  • 那是很久以前的事了。有一些 MVVM 的支持者,大声的支持者说,你永远不应该将代码与视图之外的任何东西耦合起来。听了他们这么久,把这些内容放到后面的代码里让我很痛苦。但我想这是最好的做法。
  • 要么,要么使用 Messenger/EventAggregator(参见 MVVM Light 的 Messenger 类或 PRISM 的 EventAggregator),或者创建附加属性并将您的逻辑放入它们的 OnDependencyPropertyChanged(...)
  • 或者你可以使用Caliburn Micro的附加属性,例如Message.Attach

标签: wpf mvvm


【解决方案1】:

您还可以将 3D 控件或视图包装在一个接口上,例如 IMap3D,它公开这些方法,然后将此接口传递给您的视图模型。

谈到 GIS/制图,我通常会回避事件。因此,虽然使用 EventAggregators 或类似的模式会起作用,但直接访问映射对象会移除不必要的抽象层,这通常在那些精细的性能调整练习中派上用场。

public interface IMap3D
{
    void Explode(double amount);
    void UnExplode();
    void Home();
}

public class MapViewModel
{
    private readonly IMap3D  _map3D;
    public MapViewModel(IMap3D map3D)
    {
      _map3D = map3D;
    }

    public ICommand ExplodeCommand
    {
       get
          {
             return new RelayCommand(args => true, o > { // put code to Explode _map3D  here });
          }
    }

    // expose commands for the other 3D view actions
}

请注意,您可能必须启动另一个 UI 元素来提取您想要 xplode 3D 视图的数量,除非您使用固定数量进行爆炸。这些都可以作为命令处理的一部分来完成。

【讨论】:

  • 这是个好主意。然后我可以将它反向绑定到我的视图模型上的一个属性。
【解决方案2】:

如果您不想要第三方框架,我建议您使用 Behaviors 并在您的 control 中使用 Interactions

如果不像HighCore说的

查看 MVVM Light 的 Messenger 类或 PRISM 的 EventAggregator),或创建附加属性并将您的逻辑放入它们的 OnDependencyPropertyChanged(...)

除此之外,我还建议使用Caliburn MicroMessage.Attach

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多