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:忘记添加数据模板位于资源字典中,而不是在结果视图中。

SL 从 ListItem 数据模板中向 MainPage.xaml 的视图模型触发命令

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

假设自定义项的DataTemplate驻留在ResultsView用户控件的 XAML 中。 这是一个很好的地方,但你可能已经把它放在资源字典中。

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

因此,一个

非常常见的问题是,您正在与集合绑定关联的模板中工作,因此您的DataContext是自定义项。 它不再是主视图模型本身。 这很棒,因为您可以显示自定义项的适当属性,例如 CaseID . 但是,当您想逃到视图模型的顶层时,这并不好。

如果我所说的是正确的,那么ResultsView用户控件实际上可能绑定到MainPageViewModel,因为您尚未"钻取"自定义项集合。 因此,您需要做的是找到一种方法,使用绑定语法从ListBoxDataTemplate内部引用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元素,然后我们有一个包含两部分的路径:第一部分是ResultsViewDataContext属性,它为我们提供了MainPageViewModel(是的!),然后是我们想要调用的命令的属性。

这是"转义"视图模型中更高级别绑定和发出命令的一种方法。