【问题标题】:How can I build UI on the fly in my view model如何在我的视图模型中动态构建 UI
【发布时间】:2011-06-24 08:21:10
【问题描述】:

我已经为我们的 silverlight 应用程序完全采用了 MVVM 模式。但是,我们的一些 UI 是数据驱动的。主要是两个项目...

  1. 菜单。我们正在使用 Infragistics XamMenu。

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

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

为了在视图中运行代码,我在 ViewModel 中创建了一个事件,该事件在数据加载后触发。所以,我必须在后面的视图代码中合并对视图模型的引用。我不喜欢它,它很丑……所以基本上有两个问题:

  1. 如何让视图从视图模型中获取数据已加载的消息,而无需在后面的视图代码中直接引用视图模型?目前我从数据上下文中提取引用。

  2. 是否可以在视图模型中构建 UI 并使用数据绑定。我想知道是否可以将内容控件的“内容”绑定到视图模型中的某种类型(不确定类型是什么)?当然,这方面的坏处是视图模型的可测试性似乎消失了。绑定可以这样用吗?

【问题讨论】:

    标签: design-patterns mvvm silverlight-4.0 mvvm-light


    【解决方案1】:

    要回答问题 1,为什么不使用 MVVM 轻量级“Messenger”类。

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

    Messenger.Default.Register<bool>(this, "MessageId", DoSomething);
    

    DoSomething 是一个接受布尔参数的方法(例如)。

    然后,要从您的视图模型发送消息,请执行以下操作:

     Messenger.Default.Send(false, "MessageId");
    

    希望对您有所帮助 :) 您需要将其添加到您的使用中:

    using GalaSoft.MvvmLight.Messaging;
    

    【讨论】:

    • 好的.. 我想我不知道在这里做什么。我基本上想发送“X”发生的“消息”。没有传递任何值......我只是想触发它,有点像一个事件,但不需要像你需要一个事件那样引用发送者。这可能吗?
    • 绝对可以使用示例中的代码。您必须注册事件以获取参数 - 但不是 bool,而是让它接受一个对象并通过它发送 null。然后你可以通过 DoSomething 方法在视图端做任何你想做的事情。
    • MVVM Light 在 doc 上真的很轻。 ;) prism 文档甚至说修改可视化树或引用控件的代码需要在后面的代码中。所以,我将接受这个作为问题 1 的答案,并接受“你不能”是问题 2 的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多