MVF中的WPF绑定检查事件

时间:2012-11-28 10:43:47

标签: wpf mvvm

我是MVVM模式的新手,我必须在以下视图中拦截已检查/未检查的操作

SendMessageView.xaml

<ListBox.ItemTemplate>
   <DataTemplate>
      <StackPanel>
         <CheckBox Checked="Specialita_Checked" 
                Unchecked="Specialita_Unchecked"
                Content="{Binding Path=Item.Name}"
                IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type ListBoxItem}}, 
                            Path=IsSelected,Mode=TwoWay}"/>
      </StackPanel>
   </DataTemplate>
</ListBox.ItemTemplate>

SendMessageView.xaml.cs

private void Specialita_Checked(object sender, System.Windows.RoutedEventArgs e)
{
   var aSendMessageViewModel = (SendMessageViewModel)this.DataContext;
   if (aSendMessageViewModel != null)
   {
      var aCheckBox = (CheckBox)sender;
      aSendMessageViewModel.AddSpecialita(aCheckBox.Content.ToString());
   }
}

名为aSendMessageViewModel.cs的文件是在SendMessageView.xaml.cs内调用的,这是不正确的。 帮助我正确使用MVVM模式。

2 个答案:

答案 0 :(得分:7)

在项目中添加System.Windows.Interactivity.dll并在xaml的顶部引用它(xmlns:i =“...”)

然后你可以这样做:

<ListBox.ItemTemplate>
   <DataTemplate>
      <StackPanel>
         <CheckBox Content="{Binding Path=Item.Name}"
                IsChecked="{Binding RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type ListBoxItem}}, 
                            Path=IsSelected,Mode=TwoWay}">
             <i:Interaction.Triggers>
                <i:EventTrigger EventName="Checked">
                    <i:InvokeCommandAction Command="{Binding DataContext.OnCheckedCommand, ElementName=myCtrl}" />
                </i:EventTrigger>
             </i:Interaction.Triggers>
         </CheckBox>
      </StackPanel>
   </DataTemplate>
</ListBox.ItemTemplate>

在ViewModel中使用名为OnCheckedCommand的命令来处理它。

答案 1 :(得分:0)

为什么不写

aSendMessageViewModel.AddSpecialita(aCheckBox.Content.ToString());
在ListBoxItem datacontext的IsSelected setter中?

修改

检查复选框后会发生什么情况,listBox的SelectedItem会发生变化(由于ListViewItem上的IsSelected)。 然后你可以在listBox

的DataContext的SlectedItem的setter中做一些事情
public MyObject SelectedItem 
{
   get { return _selItem; }
   set
   {
      if(_selItem != value)
      {
          if(_selItem != null)
             _selItem.OnUncheck();
          _selItem = value;
          _selItem.OnCheck();
          NotifyPropertyChange("SelectedItem"); 
      }
   }
}