我试图了解MV4和SL4中基于导航的项目模板。目前我正在尝试将ContentFrame_Navigated事件处理程序移动到ViewModel中。基本上,此事件处理程序检查菜单栏中的每个超链接按钮与当前页面,并相应地调整样式。要做到这一点,我似乎需要传递EventArgs以及另一个对象。我看到MVVM Light有PassEventArgsToCommand位,但是传递另一个对象/控件呢?在这种情况下,它是StackPanel托管菜单项超链接列表。我只是围绕MVVM概念,在这种情况下最好的做法是什么?
干杯, 达尼。
答案 0 :(得分:0)
一种解决方案是将菜单项放在ViewModel中,View可以绑定此列表。 那么View不需要将菜单项发送到ViewModel
答案 1 :(得分:0)
使用MVVM,你必须考虑更抽象。您没有使用HyperLink元素列表,而是使用导航目标列表。即您应该将演示文稿(HyperLink元素)与数据(URL,标题,是否选择项目等)分开。您现在将数据保存在ViewModel的列表中(通常您会将此数据视为超链接的ViewModel,并相应地命名)。这些项目保存在ObservableCollection中,以便您可以在添加项目时跟踪更改等。
要显示此列表,您可以使用从ItemsPresnter继承的类(例如ListBox)并使用绑定来设置属性。现在您导航到一个页面,您可以设置列表中相关项目的IsSelected属性,重置所有其他IsSelected属性。
由于导航目标可以看作是全局集合,您还可以将其保存在ViewLocator的属性中,以便所有Views和ViewModel都可以访问此列表,并且设置IsSelectedProperty适用于所有视图。此全局集合代表您的导航状态。
而且,BTW,EventToCommand,RelayCommand和Command属性都支持一个参数。此外,根据经验,我可以告诉您,混合View对象(例如EventArgs)或元素和ViewModel是不好的做法(尽管您显然可以这样做)。