2009-06-04 119 views
27

对于那些做纯MVVM的人,你如何处理一个ComboBox SelectionChanged事件而不回复到后面的代码?你如何处理MVVM中的ComboBox SelectionChanged?

我试过AttachedBehaviors但事件=“SelectedChanged”不支持:

<ComboBox> 
    <ComboBoxItem Content="Test1"> 
     <c:CommandBehaviorCollection.Behaviors> 
      <c:BehaviorBinding Event="SelectionChanged" 
           Command="{Binding SelectedChanged}" 
           CommandParameter="MainBorder123"/> 
     </c:CommandBehaviorCollection.Behaviors> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Test2"/> 
    <ComboBoxItem Content="Test3"/> 
</ComboBox> 

回答

3

你会使用数据触发不同的UI元素上触发一个事件,如“启用/禁用,或显示/隐藏”

如果您希望选定元素在其他UI元素中显示对象数据,然后您将使用数据绑定并将UI数据显示元素的datacontext设置为绑定到组合框中当前选定的项目。

+0

好吧,我可以做到这一点,如果我想要做的只是改变XAML,但如果我想要例如使用comboxbox来执行代码,以执行XAML无法完成的操作,例如加载一个新的资源文件并将其附加到当前窗口?或例如更改数据库中的一些数据等。 – 2009-06-04 13:58:39

+0

然后,您可以使用将视图模型绑定到组合框SelectionChanged。 我不确定你会在哪里寻找一个例子,但是Karl Shifflet和Josh Smith是我去参加MVVM帮助链接到他们的博客的两个主要博客。 http://karlshifflett.wordpress.com/2009/06/03/troubleshooting-silverlight-3-broken-bindings/ http://joshsmithonwpf.wordpress.com/2009/05/20/device-specific- interactive-logic-in-mvvm-application/ 对不起,我不能帮助更多的具体细节,我对WPF和MVVM本人相当陌生。 – Peter 2009-06-05 15:58:34

+0

哎呀忘了提及卡尔Shifflet已经做了很多WPF线业务事件,看他的博客,他们包含一些优秀的Powerpoint的例子和代码样本也。 – Peter 2009-06-05 16:01:37

25

我不确定是否可能,但我这样做的方式是将SelectedItem简单地绑定到视图模型上的属性。然后在属性setter中,我调用我想要发生的任何自定义代码,即根据规则设置其他属性。如果我需要将选定的项目绑定到某个对象上(对于其他绑定控件进行更新),我也将其设置在设置器中并发出通知。

53

这篇文章是相当古老,但因为我得到了同样的问题。下面是我如何解决它(使用框架4.0):这个想法是使用System.Windows.Interactivity。

在XAML:

<ComboBox ItemsSource="{Binding Items}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ComboBox> 

然后你只需要实现您的视图模型的SelectionChangedCommand。