我需要在Silverlight中使用MVVM-light,是否需要一个视图控制器?

6
我有一个关于MVVM light的问题:是什么“驱动”UI?我可以为每个显示的视图拥有一个ViewModel;ViewLocator处理所有ViewModel(据我所知,用于缓存)。但是是什么驱动了UI?
如果我在我的ViewModel中定义了一个名为“ShowDetail”的命令,我是否需要编写用于显示此视图的代码?
有没有相关示例?谢谢!
5个回答

5
MVVM模式本身并没有任何特定的解决方案来处理视图之间的导航。虽然在多个框架中有许多解决方案,最常见的解决方案是使用某种控制器来“编排”主视图,或者对子视图使用“主-从”方法。
一些有趣的解决方案:
- Rishi Oberoi(Orktane)的nRoute - Paul Stovell的Magellan - Karl Shifflett的Ocean的视图管理器 - Josh Smith的“子视图”方法

1
在 MVVM 中,驱动视图的是数据绑定。您可以通过将 View 的 DataContext 设置为指向 ViewModel 来连接 View 和 ViewModel。
简单示例(使用 MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase
{
   (...)
   private string _myProperty;
   public string MyProperty {
       get { return _myProperty; }
       set {
           _myProperty = value;
           RaisePropertyChanged("MyProperty");
       }
   }
}

MyView.xaml.cs

void MyView() {
   DataContext = new MyViewModel();
}

MyView.xaml

<TextBlock Text="{Binding MyProperty}" />

1
我的问题更多地涉及加载不同的视图。我理解 ViewModel 的绑定机制。但是,当用户执行例如“显示详细信息”按钮时,我在哪里编写代码以显示新视图? - Stefan de Vogelaere

1
我已经创建了一个T4模板,可以生成代码并演示如何导航到URI或对象,或关闭窗口(wpf)。它与mvvm light兼容。

点击此处下载


0
我建议你学习MVVM light工具包中的消息系统。这似乎是我发现的最简单的方法来实现这个功能。下面是一个示例:
如果你有两个视图模型 - 一个用于搜索客户,另一个用于显示所选客户的详细信息:
在第一个视图模型中,你可以拥有如下属性:
public string CustomerID
    {
        get
        {
            return _customerid;
        }

        set
        {
            if (_efolderid == value)
            {
                return;
            }

            var oldValue = _customerid;
            _customerid = value;

            // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
            RaisePropertyChanged("CustomerID", oldValue, value, true);
        }
    }

然后,在第二个视图模型中,您注册接收消息当该值从其他值更改时,例如:
    void registerForMessages()
    {
        Messenger.Default.Register<PropertyChangedMessage<string>>(this,
            (pcm) =>
            {
                if (pcm.PropertyName == "CustomerID")
                {
                    customerID = pcm.NewValue;
                    AddWorkplanCommand.RaiseCanExecuteChanged();
                    loadCustomerDetails();
                }
            });
    }

请确保在第二个视图模型的构造函数中调用registerForMessages()函数。另一个有帮助的方法是在应用程序中有4个或更多ViewModels时创建一种映射。我发现在解决方案中快速创建一个文本文件来跟踪所有消息以及它们的目的,以及哪些其他视图模型已注册接收它们非常容易。
其中一个非常好的事情是,您可以让1个ViewModel发送更改通知,例如customerID属性更改,并立即让其他4个ViewModels接收该更改并开始加载更改。

0

我认为你可以看看Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

这似乎很有前途。然而,我认为大多数这些框架都相当困难。

我采用了一种简单的MVVM方法实现了一个解决方案,并使用某种监督控制器模式处理视图和视图模型之间的通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接