CheckBox [Inside ListBox ItemTemplate] Checked Event未触发

时间:2013-02-08 13:42:21

标签: c# silverlight windows-phone-7 xaml windows-phone-8

这是我xaml

    <ListBox x:Name="HistoryList"          
                     ItemsSource="{Binding HistoryCollection}" 
                       >
        <ListBox.ItemTemplate >
            </DataTemplate>                 
                    <CheckBox x:Name="UpCheckBox"   Height="50" Width="50" >
                        <interactivity:Interaction.Triggers>
                            <interactivity:EventTrigger EventName="Checked">
                                <interactivity:InvokeCommandAction Command="{Binding UpCheckedCommad}" CommandParameter="{Binding ElementName=UpCheckBox}"></interactivity:InvokeCommandAction>
                            </interactivity:EventTrigger>
                        </interactivity:Interaction.Triggers>
                    </CheckBox>                 
            </DataTemplate>
        </ListBox.ItemTemplate >
    </ListBox >

ViewModel中,我使用了GalasoftMVVM Command Binding

    public ICommand UpCheckedCommad
    {
        get { return new RelayCommand<Object>(x => { PerformUpforTracks(x); }); }
    }

    void PerformUpforTracks(object x)
    {
        //TODO 
    }

我在CheckBox中使用了ListBox ItemTemplate。但我未在Checked中收到CheckBox的{​​{1}}事件。
我想从我的ViewModel获取Checked事件。
任何人都有任何想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

ListBox.ItemTemplate的每个实例都自动被赋予“集合中的当前项”作为其DataContext。在您的情况下,这是HistoryCollection中的每个单独项目。在您的示例中,EventTrigger正在您当前的HistoryItem实例中搜索“ThumbsUpCheckedCommad”。

为了强制EventTrigger搜索您想要的ViewModel,您需要指定命令绑定的“Source”属性。我建议使用RelativeSource语法,在树中搜索最后一个Control,将ViewModel作为其DataContext。

它看起来像这样。

{Binding Path=ThumbsUpCheckedCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}

答案 1 :(得分:2)

我通过这种方式绑定Command

Command="{Binding Path=DataContext.UpCheckedCommad,
          ElementName=HistoryList}"