Silverlight 如何将列表框项的数据上下文设置为其所在 View 的 Root View 模型

标签 silverlight mvvm datatemplate

在我的项目中,我有一个使用数据模板的列表框。在这个数据模板中,我有一个按钮。当列表框生成结果时,此列表框的项目源设置为某个属性集合,我们将其称为结果 [0]。

我遇到的问题是,当我单击按钮从 View 模型调用方法时,找不到该方法,因为调用正在查找列表框的上下文而不是 Root View 。我正在使用 SimpleMVVM 工具包,它使用类似于 MVVMLight 工具包的定位器。

我采用的一种方法是通过在用户控件资源中声明 View 模型并静态设置它来显式设置按钮上的数据上下文。

<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 的 Root View 模型。因此,我丢失了之前 View 模型中可能拥有的任何属性,因此我无法将它们作为参数传递给方法。

我的实现可能在这里关闭。所以我愿意接受建议。 在这种情况下,让列表框数据模板中的按钮从 View 模型调用方法并传递从选定列表框项派生的方法参数的最佳方法是什么?

要查看完整的代码实现,您可以从 SkyDrive Folder 下载示例项目。

更新 我开始在这个问题上悬赏,因为它让我很难过。随意下载示例项目以供引用。为了清楚起见,这个问题的目的是学习如何完成以下任务
1.从列表框中选择一行
2. selectionchanged事件会设置一个属性为UI中显示的文本值(RecordID双向绑定(bind)使用Inotify
3. 单击项目模板中的按钮并使用交互触发器调用存储在 ViewModel 中的方法,并在消息框中显示 RecordID 属性值。

步骤 I 和步骤 2 完成。我陷入困境的地方是了解如何获取作为列表框项目模板一部分的按钮来定位 Root 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)。

编辑 : 看了你的代码。我建议进行以下修改。
  • 不要在 XAML 中设置 DataContext 或“vm”StaticResource。
  • 使用以下代码作为 TemplateView 类的构造函数。

  • 代码 :
    public TemplateView()
    {
        var templateViewModel = new TemplateViewModel();
        this.DataContext = templateViewModel;
        this.Resources.Add("vm", templateViewModel);
        InitializeComponent();
    }
    

    这里有几个限制导致我找到了这个解决方案。首先是必须在 InitializeComponent 之前添加资源。其次是 templateViewModel 必须可用,然后才能添加资源。

    关于Silverlight 如何将列表框项的数据上下文设置为其所在 View 的 Root View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042766/

    相关文章:

    c# - java脚本到C#的回调,c#和java脚本之间的异步编程

    .net - 模型和 View 模型应该包含什么?

    silverlight - 我的 Windows Phone Silverlight 应用程序右侧的这些数字是什么?

    c# - 是否有一个很好的工具可以从 XAML 中查找对属性的引用?

    wpf - 我应该使用哪种面板来创建自定义下拉菜单?

    c# - 将事件绑定(bind)到使用 WPF 中的数据模板创建的控件

    带有用户控件的 WPF 列表框作为 ItemTemplate DataTemplate 绑定(bind)问题

    wpf - 将 CommandTarget 设置为 TabControl 中的选定控件

    silverlight - UserControl子控件和FindName

    silverlight - 使用 Rx 简化异步 Silverlight Web 服务请求