MVVM模式下的WPF绑定选中事件

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


你听说过缩进吗? - Kek
2
Kek,也许你可以编辑一下代码,使其更漂亮。(如果你有足够的声望) - Indy9000
是的,但如何对代码进行缩进呢? - AndreaG
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的命令来处理它。

好的,但是我该如何传递参数呢?要传递的参数是Item.Name。 - AndreaG
没有起作用。我使用了http://www.jarloo.com/how-to-create-a-checkedlistbox-in-wpf/并订阅了PropertyChanged事件。 - Emil Mocan

0

为什么不直接写呢?

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

在您的ListBoxItem数据上下文的IsSelected setter中?
编辑
当您选中复选框时,您的listBox的SelectedItem将更改(由于ListViewItem上的IsSelected)。 然后,您可以在listBox的DataContext的SelectedItem setter中执行某些操作。
public MyObject SelectedItem 
{
   get { return _selItem; }
   set
   {
      if(_selItem != value)
      {
          if(_selItem != null)
             _selItem.OnUncheck();
          _selItem = value;
          _selItem.OnCheck();
          NotifyPropertyChange("SelectedItem"); 
      }
   }
}

我想直接将 SendMessageView.xaml 中的已选和未选操作绑定到 aSendMessageViewModel.cs,而不需要在 SendMessageView.xaml.cs 中调用 aSendMessageViewModel。 - AndreaG
嗯......好的,好的......我想我可以使用依赖属性来实现这个...好...谢谢你的回应。 - AndreaG
你肯定也不理解MVVM模式。除了引发PropertyChanged事件和实际获取/设置值之外,绝不要在Setter/Getter中放置任何内容。 - Louis Kottmann
创建一个复杂的、难以阅读的4行XAML代码和一个需要调用的命令,是否比直接调用更好?这是有争议的。这可能取决于在该命令中要编写什么内容。实际上,如果将其放在模型设置器中,那就更好了。 - Kek
@Kek 如果你想要更详细的回答,请提出一个问题,我会尽力给出全面的答案。 - Louis Kottmann
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接