【问题标题】:Passing control as command parameter in Silverlight and MVVM Light在 Silverlight 和 MVVM Light 中将控制作为命令参数传递
【发布时间】:2011-09-27 19:38:13
【问题描述】:

我正在尝试了解 MVVM 和 SL4 中基于导航的项目模板。目前我正在尝试将 ContentFrame_Navigated 事件处理程序移动到 ViewModel 中。基本上,此事件处理程序会根据当前页面检查菜​​单栏中的每个超链接按钮,并相应地调整样式。为此,我似乎需要传递 EventArgs 以及另一个对象。我看到 MVVM Light 有 PassEventArgsToCommand 位,但是传递另一个对象/控件呢?在这种情况下,它是托管菜单项超链接列表的 StackPanel。我刚刚开始了解 MVVM 概念,在这种情况下,最佳实践是什么?

干杯, 丹妮。

【问题讨论】:

    标签: silverlight-4.0 mvvm mvvm-light


    【解决方案1】:

    使用 MVVM,您必须进行更抽象的思考。您不是在处理超链接元素列表,而是在处理导航目标列表。 IE。您应该将演示文稿(超链接元素)与数据(URL、标题、是否选择项目等)分开。您现在将数据保存在 ViewModel 的列表中(通常您会将此数据视为超链接的 ViewModel,并相应地命名)。这些项目保存在 ObservableCollection 中,以便您可以在添加项目等情况下跟踪更改。

    要显示此列表,您可以使用继承自 ItemsPresnter 的类(例如 ListBox)并使用绑定来设置属性。现在您导航到一个页面,您可以设置列表中相关项目的 IsSelected 属性,重置所有其他 IsSelected 属性。

    由于导航目标可以看作是一个全局集合,你也可以将它保存在ViewLocator上的一个属性中,这样所有的View和ViewModel都可以访问这个列表,并且设置IsSelectedProperty适用于所有的View。这个全局集合代表您的导航状态。

    而且,顺便说一句,EventToCommand、RelayCommand 和 Command 属性只支持一个参数。此外,根据经验,我可以建议您将 View 对象(例如 EventArgs 或元素)与您的 ViewModel 混合使用并不是一种好的做法(尽管您显然可以这样做)。

    【讨论】:

    • 谢谢 - 这几乎就是我想要做的,除了一点。菜单项将显示为没有 IsSelected 属性的 HyperlinkBut​​ton 控件。 App 资源通过其状态定义 HyperlinkBut​​ton 样式,当前在 View 的代码中设置。也许我需要设置一个 ListBox 项的数据模板以包含一个 HyperlinkBut​​ton,并根据单击哪个 HyperlinkBut​​ton 来设置 ListBox 项的 IsSelected 属性?这听起来合理吗?
    【解决方案2】:

    一种解决方法是把菜单项放到ViewModel中,View可以绑定这个列表。 那么 View 就不需要将菜单项发送到 ViewModel

    【讨论】:

    • 非常有趣的想法!我对 WPF 和 Silverlight 非常陌生,但会尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2014-10-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多