4

我是 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是在 a 中调用的SendMessageView.xaml.cs,这是不正确的。帮助我正确使用 MVVM 模式。

4

2 回答 2

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 的命令来处理它。

于 2012-11-28T11:21:14.697 回答
0

为什么不直接写

aSendMessageViewModel.AddSpecialita(aCheckBox.Content.ToString());

在 ListBoxItem 数据上下文的 IsSelected 设置器中?

编辑

当您选中您的复选框时会发生什么,您的 listBox 的 SelectedItem 将发生变化(由于 ListViewItem 上的 IsSelected)。然后你可以在你的 listBox 的 DataContext 的 SlectedItem 的设置器中做一些事情

public MyObject SelectedItem 
{
   get { return _selItem; }
   set
   {
      if(_selItem != value)
      {
          if(_selItem != null)
             _selItem.OnUncheck();
          _selItem = value;
          _selItem.OnCheck();
          NotifyPropertyChange("SelectedItem"); 
      }
   }
}
于 2012-11-28T10:47:45.010 回答