2012-10-29 5 views
1

Я использую ExpanderView для отображения некоторых данных в своем приложении. Но я с трудом пытаюсь выяснить, как получить данные ExpanderViewItem после его выбора.Получить выделенный элемент на expanderView

В ListBox вы можете вызвать SelectionChanged = "yourFunction" в вашем xaml-коде .. но для expanderview я понятия не имею, как это сделать?

Это мой XAML код расширителя:

<!--Custom header template--> 
    <DataTemplate x:Key="CustomHeaderTemplate"> 
     <TextBlock Text="" FontSize="28" />    
    </DataTemplate> 

    <!--Custom expander template--> 
    <DataTemplate x:Key="CustomExpanderTemplate"> 

     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 

      <Rectangle Width="400" Height="60" Fill="#FFF1F1F1" HorizontalAlignment="Stretch" StrokeThickness="0" Grid.Row="0" Grid.Column="0" /> 
      <TextBlock Text="{Binding procedureName}" FontSize="30" Foreground="#FF00457C" FontWeight="Normal" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="10,0,0,0" /> 

     </Grid> 

    </DataTemplate> 

    <!--Custom expander items template--> 
    <DataTemplate x:Key="ExpanderViewItems" > 

     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="15" /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="auto" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 

      <Image Source="{Binding flagIcon}" Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" /> 
      <TextBlock FontSize="26" Text="{Binding N}" Foreground="Black" FontWeight="Normal" Grid.Row="0" Grid.Column="1"/> 
      <TextBlock FontSize="20" Text="{Binding RNG}" Foreground="Black" FontWeight="Normal" HorizontalAlignment="Right" Grid.Row="0" Grid.Column="2"/>     
      <TextBlock FontSize="26" Text="{Binding ValueAndUnit}" Foreground="Black" FontWeight="Medium" HorizontalAlignment="Right" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/> 
      <TextBlock FontSize="18" Text="{Binding COM}" Foreground="Black" FontWeight="Normal" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" TextWrapping="Wrap" /> 
      <Line StrokeThickness="1" Stroke="#C4C6CC" Stretch="Fill" X1="0" X2="1" Y1="0" Y2="0" VerticalAlignment="Center" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" /> 
     </Grid> 
    </DataTemplate> 

<!--Listbox Containing ExpanderViews--> 
      <ListBox Name="testsList" Grid.Row="3" Grid.Column="0" > 
       <ListBox.ItemTemplate> 
        <DataTemplate> 

         <!--ExpanderView--> 
         <toolkit:ExpanderView Header="{Binding}"             
               HeaderTemplate="{StaticResource CustomHeaderTemplate}" 
               Expander="{Binding}" 
               ExpanderTemplate="{StaticResource CustomExpanderTemplate}" 
               x:Name="expander" 
               FontSize="36" 
               Foreground="#FF00457C" 
               ItemsSource="{Binding testItems}" 
               ItemTemplate="{StaticResource ExpanderViewItems}" >       
         </toolkit:ExpanderView> 

        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Я бы очень признателен за любую помощь в правильном направлении! Кажется, это вопрос, который нелегко ответить в Интернете.

ответ

1

Вы можете использовать "Tap" событие на ListBox:

В файле XAML добавить у слушателя водопроводная событие:

<!--Listbox Containing ExpanderViews--> 
     <ListBox Name="testsList" Grid.Row="3" Grid.Column="0" Tap="testsList_Tap" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 

        <!--ExpanderView--> 
        <toolkit:ExpanderView Header="{Binding}" 
        ...  

В коде позади файла, реализовать обработчик водопроводную:

private void testsList_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     someModel selectedItem = (someModel)this.testsList.SelectedItem; 
     // Do something with your seleted data 
     ... 
    } 
2

@Frederik Я реализовал то, что вы сделали в приведенном выше коде, используя событие SelectionChanged в ListBox - он все еще отлично работает для меня. Я немного бил головой о стену, но, наконец, смог ее решить. Прежде всего для ItemTemplate я убедился, что шаблон помещается в ListBoxItem элемента, как это следующим образом:

<DataTemplate x:Key="ExpanderViewItems" > 
<ListBoxItem DataContext="{Binding}" Tap="ListBoxItem_Tap_1"> 
<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="15" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto" /> 
      <ColumnDefinition Width="auto" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Image Source="{Binding flagIcon}" Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" /> 
     <TextBlock FontSize="26" Text="{Binding N}" Foreground="Black" FontWeight="Normal" Grid.Row="0" Grid.Column="1"/> 
     <TextBlock FontSize="20" Text="{Binding RNG}" Foreground="Black" FontWeight="Normal" HorizontalAlignment="Right" Grid.Row="0" Grid.Column="2"/>     
     <TextBlock FontSize="26" Text="{Binding ValueAndUnit}" Foreground="Black" FontWeight="Medium" HorizontalAlignment="Right" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/> 
     <TextBlock FontSize="18" Text="{Binding COM}" Foreground="Black" FontWeight="Normal" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" TextWrapping="Wrap" /> 
     <Line StrokeThickness="1" Stroke="#C4C6CC" Stretch="Fill" X1="0" X2="1" Y1="0" Y2="0" VerticalAlignment="Center" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3" /> 
    </Grid> 
</ListBoxItem> 
</DataTemplate> 

После этого на месте, идти в код и в случае Tap объявленной для ListBoxItem использовать что-то вроде этого:

ListBoxItem item = sender as ListBoxItem; 
ExpanderItemModel model = item.DataContext as ExpanderItemModel; 

конечно, ExpanderItemModel будет все, что вы используете для ваших деталей расширительных ...

Это работало отлично для меня

Надеюсь, это поможет!

Удачи вам!

0

Вы можете получить выбранные значения по спискуboxизмененных или расширенных расширенных событий. для LISTBOX:

private void lstExams_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (e.AddedItems.Count > 0) 
     { 
      Model.ExamTitles data = (sender as ListBox).SelectedItem as Model.ExamTitles; 
      } 
    } 

Здесь ExamTitles класса, который содержит коллекцию

Для expanderview Expanded

private void ExpanderView_Expanded(object sender, RoutedEventArgs e) 
    { 
     ExpanderView expview = (sender as ExpanderView); 
     Model.ExamTitles data = expview.Header as Model.ExamTitles; 
    } 

Надеется, что это помогает!