【发布时间】:2011-08-12 15:49:47
【问题描述】:
在我的项目中,我有一个使用数据模板的列表框。在这个数据模板中,我有一个按钮。当列表框生成结果时,此列表框的项目源设置为某个属性集合,我们将其称为 Results[0]。
我遇到的问题是,当我单击按钮从视图模型中调用方法时,找不到该方法,因为调用正在查找列表框的上下文而不是根视图。我正在使用 SimpleMVVM 工具包,它使用类似于 MVVMLight 工具包的定位器。
我采用的一种方法是通过在用户控件资源中声明视图模型并静态设置它来显式设置按钮上的数据上下文。
<UserControl.Resources>
<formatter:HighlightConverter x:Key="FormatConverter" />
<vml:SearchViewModel x:Key="vm" />
</UserControl.Resources>
然后按钮包含
<HyperlinkButton HorizontalAlignment="Left"
Click="Button_Click"
Content="{Binding Type}"
Style="{StaticResource ListBoxtTitleHyperlink}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="GetDetailID" TargetObject="{Binding Source={StaticResource vm}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</HyperlinkButton>
这是因为我现在可以访问该方法,但它实例化了一个新的视图模型,而不是允许我访问视图的根视图模型。因此,我丢失了之前视图模型中可能拥有的任何属性,因此我无法将它们作为参数传递给方法。
我的实现可能在这里关闭。所以我愿意接受建议。 在这种情况下,让列表框数据模板中的按钮调用视图模型中的方法并传递从所选列表框项派生的方法参数的最佳方法是什么?
要查看完整的代码实现,您可以从SkyDrive Folder下载示例项目
更新我开始悬赏这个问题,因为它让我很困惑。随意下载示例项目以供参考。为了清楚起见,这个问题的目的是学习如何完成以下任务 1.从列表框中选择一行 2. selectionchanged事件会设置一个属性为UI中显示的文本值(RecordID双向绑定使用Inotify 3. 单击项目模板中的按钮并使用交互触发器调用存储在 ViewModel 中的方法,并在消息框中显示 RecordID 属性值。
步骤 I 和 2 已完成。我陷入困境的地方是了解如何获取作为列表框项目模板一部分的按钮来定位根视图模型并调用该 VM 的方法,而无需实例化将重置所有先前存储的属性的新 ViewModel。
提前致谢
【问题讨论】:
标签: silverlight mvvm datatemplate