1

我的具体问题是尝试从我的 ViewModel 执行 Telerik DataBoundListBox 方法 StopPullToRefreshLoading(true)。困难在于我不想通过将应用程序逻辑放在后面的代码中来打破 MVVM 约定。

我对 MVVM 比较陌生,我不确定与视图控件上的方法交互的正确约定是什么。我已经对该主题进行了多次搜索,但尚未找到可以应用于我的情况的解决方案。我怀疑我可能已经找到了答案,但我没有得出正确的结论。

这似乎是第 3 方控制的常见情况,但也许我只是没有以正确的方式考虑这个问题。

我正在使用 MVVM Light 构建我的第一个 Windows 8 Phone 应用程序。

4

2 回答 2

1

很多人都非常纠结,认为在关注 MVVM 时,你不能在后面的代码中包含代码!!!事实并非如此,像 MVVM 这样的设计模式可以使代码更易于维护。如果某些内容仅与 UI 直接相关并且不关心 viewmodel 类中的信息,那么一定要把它放在后面的代码中。当我使用第三部分控件时,我遇到了同样的情况,有时没有其他选项比将代码放在后面的代码中更糟糕或更糟糕。

于 2012-12-11T23:09:31.743 回答
1

首先,我同意 Chris McCabe 的观点,设计模式是一个指导方针、一个框架、一个建议。它们不是生死攸关的规则。话虽如此,您应该能够在不将“真实”业务逻辑引入 UI 的情况下加入两者(VM/Telerik)。

第一种可能性是在控制器上使用事件。UI 可以订阅此事件以将调用转发到 Telerik 控件;但是,UI不应决定何时调用它。

class MyModel {
    public event EventHandler StopRefreshLoading;
}

class myForm : Form {

    public myForm(MyModel data)
    {
        data.StopRefereshLoading += (o, e) => this.CustomControl.StopPullToRefreshLoading(true);
        // ... etc
    }

坦率地说,我更喜欢使用接口来处理这种类型的行为。然后控制器很容易强制实现更新到新的合同要求。缺点是接口在复杂的 UI 中可能变得过于冗长,从而难以为其编写测试。

interface IMyModelView {
    void StopRefreshLoading();
}

class myForm : Form, IMyModelView {

    void IMyModelView.StopRefreshLoading()
    {
        this.CustomControl.StopPullToRefreshLoading(true);
    }

无论你往哪个方向走,都可能会出现一些违反 UI 设计模式的情况;然而,在现实世界中,严格遵守特定模式是没有意义的。这些模式有助于使代码更加可靠、可测试、灵活等等。决定你为什么使用一个模式,你将能够评估何时可以安全地违反该模式。

于 2012-12-11T23:36:03.630 回答