SL 从 ListItem 数据模板中向 MainPage.xaml 的视图模型触发命令
本文关键字:视图 xaml 模型 命令 MainPage ListItem 数据 SL | 更新日期: 2023-09-27 17:57:23
我可能会使这比必要的更复杂......但在这里。
我有我的 MainPage.xaml,在那里我引用了另外两个 UserControl,ResultsView 和 DetailsView。
在结果视图中,我有一个列表框绑定到自定义项的可观察集合,我有一个呈现每个项的数据模板。该项目有一个案例ID,当我单击它时,它显示为超链接按钮,我需要在MainPageViewModel中设置的命令来触发,该命令处理更改可见性以隐藏结果视图,并显示详细信息视图。
如何将超链接按钮的命令绑定到位于我的主页视图模型中的命令?
提前感谢!
编辑澄清:
MainPage.xaml
<resultsView:ResultsView/>
<detailsView:DetailsView/>
两个视图(ResultsView 和 DetailsView)中的每一个都有自己的 ViewModel。因此,我将从位于ResultsView内ListBox中的数据模板开始,我需要转到MainPageViewModel,这是比您的答案提到的额外步骤。尝试了将我的 MainPage.xaml 命名为 Name="mainPage"的方法,并将其用作我的超链接按钮中的元素名称,但没有运气。我将对RelativeSource选项进行一些研究,看看我是否可以做到这一点。
感谢您到目前为止的帮助。
编辑 2:忘记添加数据模板位于资源字典中,而不是在结果视图中。
嗯,这取决于具体的细节,不是你告诉我们的所有细节,但我可以给你一些例子。
假设自定义项的DataTemplate
驻留在ResultsView
用户控件的 XAML 中。 这是一个很好的地方,但你可能已经把它放在资源字典中。
正如您所说,ListBox
绑定到自定义项的集合。 让我们进一步假设自定义项集合本身就是MainPageViewModel
中的一个属性。 而且你已经说得很清楚,你要绑定的命令也在MainPageViewModel
.
非常常见的问题是,您正在与集合绑定关联的模板中工作,因此您的DataContext
是自定义项。 它不再是主视图模型本身。 这很棒,因为您可以显示自定义项的适当属性,例如 CaseID
. 但是,当您想逃到视图模型的顶层时,这并不好。
如果我所说的是正确的,那么ResultsView
用户控件实际上可能绑定到MainPageViewModel
,因为您尚未"钻取"自定义项集合。 因此,您需要做的是找到一种方法,使用绑定语法从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
(是的!),然后是我们想要调用的命令的属性。
这是"转义"视图模型中更高级别绑定和发出命令的一种方法。