我是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模式。
答案 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());
修改强>
检查复选框后会发生什么情况,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");
}
}
}