我可能会把它变得比必要的更复杂......但这里是。
我有我的 MainPage.xaml,其中我引用了另外两个 UserControl、ResultsView 和 DetailsView。
在 ResultsView 内部,我有一个绑定(bind)到自定义项目的 ObservableCollection 的 ListBox,我有一个呈现每个项目的 DataTemplate。该项目有一个 CaseID,当我点击它时,它显示为一个 HyperlinkButton,我需要一个我在 MainPageViewModel 中设置的命令来触发,它处理更改可见性以隐藏 ResultsView 并显示 DetailsView。
如何将超链接按钮的命令绑定(bind)到位于我的 MainPageViewModel 中的命令?
提前致谢!
编辑澄清:
主页.xaml
<resultsView:ResultsView/>
<detailsView:DetailsView/>
两个 View (ResultsView 和 DetailsView)中的每一个都有自己的 ViewModel。所以我要从我的 DataTemplate 开始,它位于我的 ResultsView 内的 ListBox 中,我需要转到 MainPageViewModel,这比你提到的答案多了一步。尝试了将我的 MainPage.xaml 命名为 Name="mainPage"的方法,并将其用作我的 HyperlinkButton 中的 ElementName,但没有成功。我将对 RelativeSource 选项做一些研究,看看我是否可以实现它。
感谢您到目前为止的帮助。
编辑 2:忘记添加 DataTemplate 在 ResourceDictionary 中,而不是在 ResultsView 中。
最佳答案
嗯,这取决于具体的细节,不是你告诉我们的所有细节,但我可以给你一些例子。
假设自定义项的 DataTemplate
位于 ResultsView
用户控件的 XAML 中。这是一个很好的位置,但您可能已将其放入资源字典中。
如您所说,ListBox
绑定(bind)到自定义项目的集合。让我们进一步假设自定义项集合本身是 MainPageViewModel
中的一个属性。而且您已经明确表示要绑定(bind)的命令也在 MainPageViewModel
中。
所以问题是一个非常常见的问题,即您在与绑定(bind)到集合相关联的模板内工作,因此您的 DataContext
是一个自定义项。它不再是主视图模型本身。这很好,因为您可以显示自定义项目的适当属性,例如 CaseID
。但是当你想逃脱到 View 模型的顶层时,它就不是很好了。
如果我所说的是真的,那么 ResultsView
用户控件实际上可能绑定(bind)到 MainPageViewModel
,因为您还没有“深入”自定义项目收集呢。因此,您需要做的是找到一种方法,使用绑定(bind)语法从 ListBox
的 DataTemplate
内部引用 ResultsView
用户控件。如果你能做到这一点,那么你就逃脱了收集。
主要有两种方法:
ElementName
语法RelativeSource
语法
我将描述 ElementName
语法,您可以查看另一个语法。
第 1 部分)将您的 ResultsView
UserControl
元素命名为:
<UserControl ....
Name="resultsView">
<!-- ... -->
第 2 部分)在定义超链接外观的 DataTemplate
中,使用 ElementName
语法来引用该元素:
<TextBlock>
<Hyperlink Command="{Binding DataContext.ItemDetailsCommand, ElementName=resultsView}"/>
</TextBlock>
所以首先我们使用 ElementName
来获取 ResultsView
UserControl
元素,然后我们有一个包含两部分的路径:第一部分是ResultsView
的 DataContext
属性为我们提供了 MainPageViewModel
(是的!),然后是我们要调用的命令的属性。
这是一种“转义”绑定(bind)并发出在 View 模型中更高级别发现的命令的方法。
关于c# - SL 从 ListItem 数据模板中向 MainPage.xaml 的 ViewModel 触发命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105211/