0

Я создаю специальную телефонную книгу, которая читает контакты телефонной книги и отображает внутри моего приложения. Поэтому я создаю селектор длинного списка и список внутри него.Команда Listbox внутри селектора длинного списка не стреляет - Телефон Windows 8 - MVVM

Мой список будет содержать имя контактного телефона и список номеров телефонов с установленным флажком под конкретным именем. Я написал триггер событий в моем списке, чтобы щелкнуть по нему флажок.

ПРОБЛЕМА: Событие не стреляет в модель. Я подозреваю, что, поскольку список присутствует в другом списке (селектор длинного списка), событие не запускается.

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

Любые предложения оценили !!

ответ

2

Самый простой способ сделать вложенную связывают 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}" /> 
+0

Спасибо. Работает. ! –

+0

Рад помочь! Если он решит проблему, можете ли вы пометить ответ как принятый? – andreask