在我的项目中,我有一个使用数据模板的列表框。在此数据模板中,我有一个按钮。当列表框生成结果时,该列表框的项目源将设置为某个属性集合,我们将其称为“结果[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)。

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

  • 代码:
    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/

    10-13 03:16