我可能会把这个变得比必要的更复杂......但是这里有。
我有我的MainPage.xaml,在那里我引用了另外两个UserControl,ResultsView和DetailsView。
在ResultsView的内部,我有一个ListBox绑定到自定义项的ObservableCollection,我有一个DataTemplate渲染每个项目。该项目有一个CaseID,当我点击它时,它显示为一个HyperlinkButton,我需要一个我在MainPageViewModel中设置的命令来触发,它处理更改可见性以隐藏ResultsView,并显示DetailsView。
如何将超链接按钮的命令绑定到位于我的MainPageViewModel中的命令?
提前致谢!
编辑以澄清:
MainPage.xaml中
<resultsView:ResultsView/>
<detailsView:DetailsView/>
两个视图(ResultsView&amp; DetailsView)中的每一个都有自己的ViewModel。所以我要从位于ResultsView内部的ListBox中的DataTemplate开始,我需要进入MainPageViewModel,这比你提到的答案还要多。试过你的方法命名我的MainPage.xaml到Name =“mainPage”,并在我的HyperlinkButton中使用它作为ElementName,但没有运气。我将对RelativeSource选项进行一些研究,看看我能否做到这一点。
感谢您的帮助。
编辑2:忘记添加DataTemplate在ResourceDictionary中,而不是在ResultsView中。
答案 0 :(得分:1)
嗯,这取决于具体细节,而不是你告诉我们的所有细节,但我可以给你一些例子。
假设您的自定义项DataTemplate
位于ResultsView
用户控件的XAML中。这是一个很好的选择,但你可能把它放在资源词典中。
正如您所说,ListBox
绑定到自定义项的集合。让我们进一步假设自定义项集合本身就是MainPageViewModel
中的属性。而且你已经清楚地说明了你要绑定的命令也在MainPageViewModel
。
所以问题是一个非常常见的问题,就是你在一个与集合绑定相关联的模板中工作,因此你的DataContext
是一个自定义项。它不再是主要的视图模型本身。这很好,因为您显示自定义项目的适当属性,如CaseID
。但是当你想逃避到顶级视图模型时,它并不是很好。
如果我说的是真的,那么ResultsView
用户控件实际上可能绑定到MainPageViewModel
,因为您还没有“钻进”自定义项集合。因此,您需要做的是找到一种方法,使用绑定语法从ResultsView
内DataTemplate
引用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
(是的!),然后是我们想要调用的命令的属性。
这是一种“逃避”绑定并在视图模型中发现更高级别命令的方法。