【问题标题】:Datacontext of nested user controls嵌套用户控件的数据上下文
【发布时间】:2012-11-07 05:11:34
【问题描述】:

背景:-

我有一个 wpf 视图,其中包含一个组合框,该组合框由使用 caliburn micro/ninject 和 mvvm 模式的视图模型填充;此视图还包含一个堆栈面板区域。当用户从组合框中选择适当的选项时,我将适当的用户控件插入到堆栈面板中,向用户呈现到相关显示的无缝过渡。

在堆栈面板中显示的每个“嵌套”用户控件都有自己的视图模型,由 caliburn micro 自动关联。

问题:-

“嵌套的”用户控件绑定都尝试引用父视图模型,而不是专门与它们关联的视图模型。

最初,我可以通过指定来解决这个问题:-

<UserControl.DataContext>
    <vm:UserControlSpecificViewModel/>
</UserControl.DataContext>

但这需要视图模型中的无参数构造函数,但我需要能够将参数传递给此视图模型,以便 Ninject 可以注入诸如 EventAggregator 之类的对象。

由于我对 WPF 还很陌生,所以我将不胜感激。

谢谢。

詹姆斯。

【问题讨论】:

  • 需要向视图模型传递什么样的参数?
  • 嗨 - 主要是 IEventAggregator
  • @xnetdude。上次我查看 caliburn 时(已经有一段时间了!)我认为它有一个视图模型的概念,其中包含子视图模型融入架构。大概他们会知道如何联系他们的父母,但我不知道。您是否在 caliburn 的 codeplex 论坛上发布过这个问题?

标签: c# wpf mvvm ninject caliburn


【解决方案1】:

解决您的问题的一种方法可能是在代码中初始化您的视图模型并调用适当的构造函数。如果您不喜欢 WPF 应用程序中的代码,那么我想您可以将视图模型绑定到 IEventAggregator 对象。

XAML:

<UserControl1 x:Name="myUserControl">
</UserControl>

代码隐藏:

public MainWindow() // Constructor for window
{
    InitializeContext();
    MyViewModel vm = new MyViewModel(...);
    myUserControl.DataContext = vm;
}

【讨论】:

  • 您好 - 感谢您的回复。我对 WPF 很陌生,所以您介意举一个将视图模型绑定到 IEventAggregator 的示例吗?
  • 您能否提供一些代码来说明您如何初始化IEventAggregator
  • namespace MyApp.Application.Bootstrapping { public class ApplicationModule : Ninject.Modules.NinjectModule { public override void Load() { // 必需的 Caliburn Micro 对象 Bind().To( ).InSingletonScope();绑定().To().InSingletonScope(); // Automapper BootStrapper Bind().To(); } } }
  • 对格式感到抱歉 - 将尝试找出如何正确发布
  • 既然你已经拥有了所有这些代码,我猜你并不关心在你的代码后面再添加一行。在窗口的构造函数中,只需创建并初始化视图模型,然后将其设置为用户控件的数据上下文。您显然需要命名您的用户控件才能从后面的代码中访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2011-03-21
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多