C# 如何在不破坏MVVM约定的情况下调用第三方控件上的方法?

C# 如何在不破坏MVVM约定的情况下调用第三方控件上的方法?,c#,mvvm,telerik,mvvm-light,windows-phone-8,C#,Mvvm,Telerik,Mvvm Light,Windows Phone 8,我的具体问题是试图从我的ViewModel执行Telerik DataBoundListBox方法StopPullToRefreshLoading(true)。困难在于我不想通过在代码中加入应用程序逻辑来打破MVVM惯例 我对MVVM比较陌生,我不确定与视图控件上的方法交互的适当约定是什么。我已经在这个话题上做了很多搜索,但我还没有找到一个适合我的情况的解决方案。我想我可能已经找到了答案,但我没有得出正确的结论 这似乎是第三方控制的常见情况,但也许我只是没有以正确的方式考虑问题 我正在使用MVV

我的具体问题是试图从我的ViewModel执行Telerik DataBoundListBox方法StopPullToRefreshLoading(true)。困难在于我不想通过在代码中加入应用程序逻辑来打破MVVM惯例

我对MVVM比较陌生,我不确定与视图控件上的方法交互的适当约定是什么。我已经在这个话题上做了很多搜索,但我还没有找到一个适合我的情况的解决方案。我想我可能已经找到了答案,但我没有得出正确的结论

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


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

很多人都会挂掉,认为在使用MVVM时,代码中不能包含代码!!!事实并非如此,像MVVM这样的设计模式是为了使代码更易于维护。如果某些东西只与UI直接相关,而不关心viewmodel类中的信息,那么一定要将其放在代码中。我在使用第三部分控件时也遇到过同样的情况,有时没有比将代码放在后面更糟糕或更糟糕的选择了。

首先,我同意Chris McCabe的观点,设计模式是一个指导原则、一个框架、一个建议。它们不是生存或死亡的准则。也就是说,您应该能够在不向UI引入“真实”业务逻辑的情况下加入这两个(VM/Telerik)

第一种可能是在控制器上使用事件。用户界面可以订阅此事件以将调用转发给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设计模式的情况;然而,在现实世界中,严格遵守特定的模式是没有意义的。这些模式有助于使代码更加可靠、可测试、灵活等等。决定为什么要使用某个模式,您将能够评估何时可以安全地违反该模式。

感谢您的回复,我得到了一致的建议,即不要在任何事情上都过于坚持遵循MVVM。因为我尝试调用的方法与控件相关,而与我的应用程序逻辑无关,所以我确信从代码后面调用是可以的。再次感谢。谢谢你的回复。我计划将控件的方法调用放在代码隐藏中的函数中,然后从我的ViewModel调用代码隐藏方法。如果我没有将函数调用显式地耦合到我的ViewModel,我应该能够遵守ViewModel中没有视图特定逻辑的要求。我还有很多东西要学。