Design patterns 如何在视图模型中动态构建UI

Design patterns 如何在视图模型中动态构建UI,design-patterns,mvvm,silverlight-4.0,mvvm-light,Design Patterns,Mvvm,Silverlight 4.0,Mvvm Light,我已经完全采用了我们silverlight应用程序的MVVM模式。然而,我们的一些UI是数据驱动的。主要有两项 菜单。我们正在使用基础设施XamMenu 我们有一个“仪表板”,允许用户添加“管理单元”。这有点像iGoogle这样的门户网站 在上述两种情况下,都需要在运行时构建UI。目前我正在运行代码隐藏中的代码,因为我看不到访问ViewModel中UI树的简单方法 为了在视图中运行代码,我在ViewModel中创建了一个事件,一旦加载数据就会触发该事件。因此,我必须在视图代码中隐藏对viewmo

我已经完全采用了我们silverlight应用程序的MVVM模式。然而,我们的一些UI是数据驱动的。主要有两项

  • 菜单。我们正在使用基础设施XamMenu

  • 我们有一个“仪表板”,允许用户添加“管理单元”。这有点像iGoogle这样的门户网站

  • 在上述两种情况下,都需要在运行时构建UI。目前我正在运行代码隐藏中的代码,因为我看不到访问ViewModel中UI树的简单方法

    为了在视图中运行代码,我在ViewModel中创建了一个事件,一旦加载数据就会触发该事件。因此,我必须在视图代码中隐藏对viewmodel的引用。我不喜欢它,它很难看。。。所以基本上有两个问题:

  • 如何让视图从viewmodel中获取数据已加载的消息,而不在视图代码中直接引用viewmodel?目前,我从数据上下文中提取引用

  • 是否可以在视图模型中构建UI并使用数据绑定。我想知道是否可以将contentcontrol的“内容”绑定到viewmodel中的某个类型(不确定该类型是什么)?当然,最糟糕的是视图模型的可测试性似乎消失了。装订可以这样使用吗


  • 为了回答问题1,为什么不使用MVVM light“Messenger”类呢

    在您看来,您可以通过以下方式注册以收听消息:

    Messenger.Default.Register<bool>(this, "MessageId", DoSomething);
    
    希望有帮助:)您需要将此添加到您的使用中:

    using GalaSoft.MvvmLight.Messaging;
    

    好啊我想我不知道该怎么办。我基本上想发送一个“消息”,说明“X”发生了。没有传递任何值。。。我只是想触发它,有点像一个事件,但不需要像事件一样引用发送者。这可能吗?使用示例中的代码绝对可能。您必须注册事件以获取一个参数,但不要使用bool,只需让它接受一个对象并发送null即可。然后你可以通过DoSomething方法在视图端做任何你想做的事情prism文档甚至说修改可视化树或引用控件的代码需要在代码后面。所以,我将接受这一点作为问题1的答案,并接受“你不能”是问题2的答案。谢谢
    using GalaSoft.MvvmLight.Messaging;