c# - SL 从 ListItem 数据模板中向 MainPage.xaml 的 ViewModel 触发命令

标签 c# silverlight mvvm command

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

我有我的 MainPage.xaml,其中我引用了另外两个 UserControl、ResultsView 和 DetailsView。

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

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

提前致谢!

编辑澄清:

主页.xaml

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

两个 View (ResultsView 和 DetailsView)中的每一个都有自己的 ViewModel。所以我要从我的 DataTemplate 开始,它位于我的 ResultsView 内的 ListBox 中,我需要转到 MainPageViewModel,这比你提到的答案多了一步。尝试了将我的 MainPage.xaml 命名为 Name="mainPage"的方法,并将其用作我的 HyperlinkBut​​ton 中的 ElementName,但没有成功。我将对 RelativeSource 选项做一些研究,看看我是否可以实现它。

感谢您到目前为止的帮助。

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

最佳答案

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

假设自定义项的 DataTemplate 位于 ResultsView 用户控件的 XAML 中。这是一个很好的位置,但您可能已将其放入资源字典中。

如您所说,ListBox 绑定(bind)到自定义项目的集合。让我们进一步假设自定义项集合本身是 MainPageViewModel 中的一个属性。而且您已经明确表示要绑定(bind)的命令也在 MainPageViewModel 中。

所以问题是一个非常常见的问题,即您在与绑定(bind)到集合相关联的模板内工作,因此您的 DataContext 是一个自定义项。它不再是主视图模型本身。这很好,因为您可以显示自定义项目的适当属性,例如 CaseID。但是当你想逃脱到 View 模型的顶层时,它就不是很好了。

如果我所说的是真的,那么 ResultsView 用户控件实际上可能绑定(bind)到 MainPageViewModel,因为您还没有“深入”自定义项目收集呢。因此,您需要做的是找到一种方法,使用绑定(bind)语法从 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(是的!),然后是我们要调用的命令的属性。

这是一种“转义”绑定(bind)并发出在 View 模型中更高级别发现的命令的方法。

关于c# - SL 从 ListItem 数据模板中向 MainPage.xaml 的 ViewModel 触发命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105211/

相关文章:

c# - 绑定(bind)在 Mvvm wpf 和 controltab 中不起作用

c# - 排除没有数据的对象

c# - 如何打印 XMLNodeList 中的节点

c# - 如何在 ASP.Net MVC 中将 RDLC 报告与 ReportViewer 控件一起使用?

c# - 有没有办法通过 VS 设计器严格将控件颜色设置为十六进制值?

c# - 按不同日期排序时选择要列出的值()

Java 和 Silverlight 永远在一起

c# - 在 .NET 中开发在线网络摄像头视频监控系统(实时视频流问题)

c# - 在没有 MVVM 的情况下更新 LongListSelector ItemSource

c# - WPF中的字符串计算器,在ViewModel中填充文本框