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());
   }
}

呼び出されたファイルは aaSendMessageViewModel.cs内で呼び出されて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 に答える