在我的项目中,我有一个使用数据模板的列表框。在此数据模板中,我有一个按钮。当列表框生成结果时,该列表框的项目源将设置为某个属性集合,我们将其称为“结果[0]”。
我遇到的问题是,当我单击按钮从 View 模型中调用方法时,找不到该方法,因为该调用查找的是列表框而不是根 View 的上下文。我正在使用SimpleMVVM工具箱,该工具箱使用的定位器类似于MVVMLight工具箱。
我采取的一种方法是通过在用户控件资源中声明viewmodel并进行静态设置来显式设置按钮上的数据上下文。
<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>
这样做的事实是,我现在可以访问该方法,但是它实例化了一个新的 View 模型,而不是允许我访问 View 的根 View 模型。因此,我失去了先前 View 模型中可能拥有的所有属性,因此无法将它们作为参数传递给方法。
我的实现可能在这里关闭。因此,我愿意接受建议。 在这种情况下,使列表框数据模板中的按钮具有最佳方法是从 View 模型中调用方法并传递从所选列表框项目派生的方法参数?
要查看完整的代码实现,可以从SkyDrive Folder下载示例项目。
更新因为这个问题我感到很困惑,所以我开始悬赏这个问题。随时下载示例项目以供引用。为了清楚起见,此问题的目的是学习如何完成以下任务
1.从列表框中选择一行
2. selectionchanged事件将为UI中显示的文本值设置一个属性(使用Inotify的RecordID双向绑定(bind))
3.单击项目模板内的按钮,并使用交互触发器调用ViewModel中存储的方法,并在消息框中显示RecordID属性值。
步骤1和2已完成。我受困的是了解如何获取列表框项目模板中的按钮,以定位根 View 模型并调用该VM的方法,而无需实例化将重置所有先前存储的属性的新ViewModel。
提前致谢
最佳答案
以编程方式添加资源。 StaticResource绑定(bind)在设计时可能会提示,但在运行时它应该可以正常工作。
UserControl具有Resources属性,该属性返回对ResourceDictionary的引用。您可以向其中添加ViewModel,其效果将与您的Xaml示例相同,除了可以重用现有的ViewModel。
假设您的MVVM框架已经使用ViewModel填充了UserControl的DataContext,则可以使用类似于以下内容的C#代码来设置资源。
this.Resources.Add("vm", this.DataContext);
如果DataContext已在UserControl的构造函数中设置,则可以将其放到那里。否则,您将需要找到一个在UserControl生命周期的后期被调用的钩子(Hook)。
编辑:看过您的代码。我建议进行以下修改。
代码:
public TemplateView()
{
var templateViewModel = new TemplateViewModel();
this.DataContext = templateViewModel;
this.Resources.Add("vm", templateViewModel);
InitializeComponent();
}
这里有两个约束使我找到了这个解决方案。首先是必须在InitializeComponent之前添加资源。其次,可以在添加资源之前templateViewModel必须可用。
关于silverlight - Silverlight如何将列表框项目的数据上下文设置为其所在 View 的根 View 模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7042766/