SL从ListItem数据模板中将命令发送到MainPage.xaml的ViewModel

时间:2011-05-24 02:49:08

标签: c# silverlight mvvm command

我可能会把这个变得比必要的更复杂......但是这里有。

我有我的MainPage.xaml,在那里我引用了另外两个UserControl,ResultsView和DetailsView。

在ResultsView的内部,我有一个ListBox绑定到自定义项的ObservableCollection,我有一个DataTemplate渲染每个项目。该项目有一个CaseID,当我点击它时,它显示为一个HyperlinkBut​​ton,我需要一个我在MainPageViewModel中设置的命令来触发,它处理更改可见性以隐藏ResultsView,并显示DetailsView。

如何将超链接按钮的命令绑定到位于我的MainPageViewModel中的命令?

提前致谢!

编辑以澄清:

MainPage.xaml中

<resultsView:ResultsView/>
<detailsView:DetailsView/>

两个视图(ResultsView&amp; DetailsView)中的每一个都有自己的ViewModel。所以我要从位于ResultsView内部的ListBox中的DataTemplate开始,我需要进入MainPageViewModel,这比你提到的答案还要多。试过你的方法命名我的MainPage.xaml到Name =“mainPage”,并在我的HyperlinkBut​​ton中使用它作为ElementName,但没有运气。我将对RelativeSource选项进行一些研究,看看我能否做到这一点。

感谢您的帮助。

编辑2:忘记添加DataTemplate在ResourceDictionary中,而不是在ResultsView中。

1 个答案:

答案 0 :(得分:1)

嗯,这取决于具体细节,而不是你告诉我们的所有细节,但我可以给你一些例子。

假设您的自定义项DataTemplate位于ResultsView用户控件的XAML中。这是一个很好的选择,但你可能把它放在资源词典中。

正如您所说,ListBox绑定到自定义项的集合。让我们进一步假设自定义项集合本身就是MainPageViewModel中的属性。而且你已经清楚地说明了你要绑定的命令也在MainPageViewModel

所以问题是一个非常常见的问题,就是你在一个与集合绑定相关联的模板中工作,因此你的DataContext是一个自定义项。它不再是主要的视图模型本身。这很好,因为您显示自定义项目的适当属性,如CaseID。但是当你想逃避到顶级视图模型时,它并不是很好。

如果我说的是真的,那么ResultsView用户控件实际上可能绑定到MainPageViewModel,因为您还没有“钻进”自定义项集合。因此,您需要做的是找到一种方法,使用绑定语法从ResultsViewDataTemplate引用ListBox用户控件。如果你能做到这一点,那你就逃过了收藏。

有两种主要方法可以做到这一点:

  • ElementName语法
  • RelativeSource语法

我将描述ElementName语法,您可以查找另一个语法。

第1部分)将您的ResultsView UserControl元素命名为:

<UserControl ....
    Name="resultsView">
    <!-- ... -->

第2部分)在您定义超链接外观的DataTemplate内,使用ElementName语法来引用该元素:

<TextBlock>
    <Hyperlink Command="{Binding DataContext.ItemDetailsCommand, ElementName=resultsView}"/>
</TextBlock>

首先我们使用ElementName来获取ResultsView UserControl元素,然后我们有一个包含两个部分的路径:第一部分是DataContext属性ResultsView给了我们MainPageViewModel(是的!),然后是我们想要调用的命令的属性。

这是一种“逃避”绑定并在视图模型中发现更高级别命令的方法。