长列表选择器中的列表框命令未触发 - Windows phone 8 - MVVM

Command of Listbox inside long list selector not firing - Windows phone 8 - MVVM

我正在创建自定义 phone 书籍,其中读取 phone 书籍联系人并显示在我的应用程序中。所以我在里面创建了一个长列表选择器和一个列表框。

我的列表框将包含 phone 联系人姓名和 phone 号码列表,并在特定姓名下方带有复选框。我在我的列表框中写了一个事件触发器来跟踪复选框是否被点击。

问题:事件未在视图模型中触发。我怀疑因为列表框存在于另一个列表(长列表选择器)中,所以事件没有触发。

这是xaml代码:

<phone:LongListSelector Grid.Row="3" LayoutMode="List" ItemsSource="{Binding PhoneBookDataSource}" IsGroupingEnabled="True" HideEmptyGroups="True">
        <phone:LongListSelector.ItemTemplate>
            <DataTemplate>
            <StackPanel Orientation="Vertical" >
                    <TextBlock Text="{Binding PhoneContactName}" FontWeight="SemiBold" FontSize="36" Foreground="Green"></TextBlock>
                    <ListBox ItemsSource="{Binding LstPhoneContactNumber,Mode=TwoWay}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                        <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Tap">
                                    <i:InvokeCommandAction Command="{Binding PhoneNumberCheckedStateChangeCommand}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid Width="480">
                                    <TextBlock Text="{Binding PhoneNumberItem}" FontSize="25" HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Gray"></TextBlock>
                                    <CheckBox Foreground="Black" Background="Black" VerticalAlignment="Center" HorizontalAlignment="Right" IsChecked="{Binding IsPhoneNumberItemChecked,Mode=TwoWay}"></CheckBox>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
            </StackPanel>
            </DataTemplate>
        </phone:LongListSelector.ItemTemplate>
        <phone:LongListSelector.GroupHeaderTemplate>
            <DataTemplate>
                <Border Background="Transparent" Padding="5">
                    <Border Background="{StaticResource PhoneAccentBrush}" BorderBrush="{StaticResource PhoneAccentBrush}" BorderThickness="2" Width="62" 
     Height="62" Margin="0,0,18,0" HorizontalAlignment="Left">
                        <TextBlock Text="{Binding Key}" Foreground="{StaticResource PhoneForegroundBrush}" FontSize="48" Padding="6" 
        FontFamily="{StaticResource PhoneFontFamilySemiLight}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
                    </Border>
                </Border>
            </DataTemplate>
        </phone:LongListSelector.GroupHeaderTemplate>
        <phone:LongListSelector.JumpListStyle>
            <Style TargetType="phone:LongListSelector">
                <Setter Property="GridCellSize"  Value="113,113"/>
                <Setter Property="LayoutMode" Value="Grid" />
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border Background="{Binding Converter={StaticResource BackgroundConverter}}" Width="113" Height="113" Margin="6" >
                                <TextBlock Text="{Binding Key}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="48" Padding="6" 
           Foreground="{Binding Converter={StaticResource ForegroundConverter}}" VerticalAlignment="Center"/>
                            </Border>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </phone:LongListSelector.JumpListStyle>
    </phone:LongListSelector>

这是我的视图模型:

public DelegateCommand PhoneNumberCheckedStateChangeCommand { get; set; }
    public DelegateCommand SendSMSCommand { get; set; }

public CustomPhoneBookViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smartDispatcher)
        : base(nav, data, encrypt, geoLocation, msgBus, smartDispatcher)
    {
        IsProgressBarBusy = true;
        PhoneContactsList = new ObservableCollection<PhoneBookEntity>();
        PhoneBookDataSource = new ObservableCollection<LLSAlphaKeyGroup<PhoneBookEntity>>();
        InitializeDelegateCommands();
        GetDeviceResolution();
        ReadPhoneBook();
    }

private void OnPhoneNumberItemCheckedStateChangedCommand()
    {
        try
        {
            foreach (var parentItem in PhoneBookDataSource)
            {
                foreach (var childItem in parentItem)
                {
                    foreach (var item in childItem.LstPhoneContactNumber)
                    {
                        if (item.IsPhoneNumberItemChecked)
                            IsSendSMSButtonEnabled = true;
                        return;
                    }
                }
                IsSendSMSButtonEnabled = false;
            }
        }
        catch { }
        finally
        {
            SendSMSCommand.RaiseCanExecuteChanged();
        }
    }

如有任何建议,我们将不胜感激!!

使嵌套的 ListBox 交互绑定到全局 ViewModel(而不是绑定到它自己的嵌套 DataContext)的最简单方法是为最外面的 LongListSelector 分配一个唯一的名称:

<phone:LongListSelector x:Name="OuterList" Grid.Row="3" LayoutMode="List" ItemsSource="{Binding PhoneBookDataSource}" IsGroupingEnabled="True" HideEmptyGroups="True">

并将命令显式绑定到此元素的 DataContext(这是全局 ViewModel):

<i:InvokeCommandAction Command="{Binding ElementName=OuterList, Path=DataContext.PhoneNumberCheckedStateChangeCommand}" />