SL ItemsControl,ViewModel上的命令没有从ItemsControl(CheckBox)触发

时间:2010-10-21 12:21:09

标签: silverlight data-binding checkbox itemscontrol command

我正在使用PRISM v2,CAL,SL4和MVVM,并在我的ViewModel上有一个名为CheckCommand的委托命令。 ItemsControl包含一个复选框,我试图获取ItemsControl / Checkbox中的项目,以便在检查时触发此命令 - 但它不会回传给viewmodel!

我认为这是因为每个项目的“datacontext”是项目绑定的单个对象,而不是ViewModel? - 我的怀疑实际上是正确的,因为如果我将我的DelegateCommand移出viewmodel并进入定义itemscontrol中的项目的类,我可以看到命令/方法被触发!

查看:

<ListBox x:Name="BasketListBox" ItemsSource="{Binding BasketCollection}" MinWidth="200">
<ListBox.ItemTemplate>
    <DataTemplate>
        <CheckBox commands:Checked.Command="{Binding CheckCommand}"  IsChecked="False" </CheckBox>
    </DataTemplate>       
</ListBox.ItemTemplate>

有人能指出我正确的方向吗?

干杯,麦克德。

编辑1:

命令现在有效,请参阅下面的解决方案。但是,我现在遇到另一个问题:
“创建名为'basketRegion'的区域时发生异常。例外是:System.InvalidOperationException:ItemsControl的ItemsSource属性不为空。此控件与区域关联,但控件已绑定到其他位置。如果您没有显式设置控件的ItemSource属性,这个异常可能是由继承的RegionManager附加属性值的变化引起的“

为此问题创建了单独的问题,使其更加干净:

PRISM-MVVM, ItemsControl problem with View injection

2 个答案:

答案 0 :(得分:1)

您希望每个CheckBox发出相同的命令吗?你可以:

<CheckBox commands:Checked.Command="{Binding DataContext.CheckCommand, ElementName=BasketListBox}"

或者你可以让每个子视图模型通过它们自己的属性公开命令。

答案 1 :(得分:0)

Thanx Kent。你让我走上正确的道路来解决这个问题,最后这样做了:

<ListBox x:Name="basketListBox" ItemsSource="{Binding basketcollection}" MinWidth="200">
<ListBox.ItemTemplate>
<DataTemplate>
        <CheckBox commands:Checked1.Command="{Binding DataContext.CheckCommand, ElementName=basketListBox}" Content="{Binding basketName}">             </CheckBox>
    </DataTemplate>       
</ListBox.ItemTemplate>