2010-07-30 64 views
0

我正在使用MVVM light将View中的UIElements上的事件绑定到我的视图模型中的ICommands,并且工作得非常好。MVVM Light:将事件绑定到后面代码中的命令

但是 - 我有一种情况,我必须在运行中创建一些控件,并且在代码背后的视图中执行此操作,因为这看起来是最好的地方,它毕竟是UI码。当我在代码中生成这些控件时,我还需要在代码中创建事件绑定,并且尽管进行了多次尝试,但我还没有达到期望的结果。

有没有人做过这个或做过任何人知道如何?

任何帮助表示赞赏!

+2

这不能回答你的问题,但你确定你需要在运行时生成控件吗?同样的事情可以通过数据模板来完成,可能还有触发器或模板选择器? – 2010-07-30 12:59:57

回答

0

我不知道MVVM Light,但假设您的viewmodel设置为您的视图的DataContext,至少有以下两个选项。

  1. 如果您知道连接到您的视图中的视图模型的类型,你可以直接访问该视图模型的命令,也没有必要使用绑定,你可以直接设置在Command属性:

    var buttonA = new Button(); 
    buttonA.Content = "Click me"; 
    buttonA.Command = (DataContext as TheViewModel).TheCommand; 
    
  2. 如果你不知道,你可以创建通过以下方式绑定您的视图模型的类型:

    var buttonB = new Button(); 
    buttonB.Content = "Click me too"; 
    var binding = new Binding("TheCommand"); 
    binding.Source = DataContext; 
    buttonB.SetBinding(Button.CommandProperty, binding); 
    
+0

我相信这个问题更多的是关于如何通过代码而不是XAML来添加包含在MVVM Light Toolkit中的EventToCommand附加属性。 – 2010-07-30 12:58:58

+0

我认为你是对的。我想我的答案并没有多大用处: - | – 2010-07-30 14:55:51

0

感谢您的回答和评论。马特是正确的 - 问题是如何在代码中使用EventToCommand而不是XAMl。马特 - 我确实需要在运行时生成控件,因为直到那时我才知道控件是什么。控件位于功能区上,功能区与上下文相关,即每当更改主视图时,功能区上的控件随之更改并需要生成。

我发现了一个使用附加属性的解决方案,但我仍然想知道MVVM Light是如何(以及如何)完成的。

+0

嗨肖恩 - 欢迎来到StackOverflow。您应该将此评论发布为对您的问题的修改 - 这是详细说明,而不是答案,它属于您的原始问题。然而,关于您的评论,仍然有可能通过纯Xaml和巧妙使用数据模板在功能区上生成上下文敏感的更改。我建议不要在代码中这样做,因为它限制了您的灵活性,并使Xaml更紧密地绑定到它的代码隐藏(这在WPF中很少需要做)。 – 2010-08-05 06:53:55

+0

如果您编辑您的原始问题以询问如何完成这些工作,我肯定会有人回答(可惜我现在还没有时间,但我稍后会回来检查!)。 – 2010-08-05 06:54:13