2014-08-28 2 views
1

My Longlistselector DataTemplateкак получить значение флажка из LongListSelector в WP8

<DataTemplate x:Key="NotesListBoxItemTemplate"> 
    <Grid HorizontalAlignment="Stretch"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.5*"/> 
      <ColumnDefinition Width="3*"/> 
     </Grid.ColumnDefinitions> 
     <CheckBox 
      Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" 
      x:Name="chkDelete" 
      Visibility="Visible" Tap="chkDelete_Tap" Margin="0,36,0,0" /> 
     <TextBlock 
      Text="{Binding NoteName}" 
      FontSize="{StaticResource PhoneFontSizeLarge}" 
      FontFamily="Segoe WP" 
      Grid.Row="0" Grid.Column="1" Margin="12,24,0,0" />       
    </Grid> 
</DataTemplate> 

и мой селектор лонга является

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
    <ScrollViewer> 
      <phone:LongListSelector 
       x:Name="MainListBox" 
       ItemsSource="{Binding AllData}" 
       Margin="12, 0, 12, 0" 
       ItemTemplate="{StaticResource ListBoxItemTemplate}" /> 
    </ScrollViewer> 
</Grid> 

Как я цикл по элементам и получить галочку состояния в каждый элемент? Раньше я использовал ListBox, и он работал правильно. И я могу узнать значение флажок в каждой позиции, используя ниже код

private T FindFirstElementInVisaulTree<T>(DependencyObject parentElement) where T:DependencyObject 

ListBoxItem прошел как DependencyObject. Единственная проблема с ListBox - прокрутка. Поэтому стараемся использовать LongListSelector.

Пожалуйста, как я прокручиваю элементы в LongListSelector.

Спасибо

ответ

1

Вы можете также данные Bind состояния флажка на вашу модель. Затем вы можете просто пропустить MainListBox.ItemsSource. Если вы сделаете это так, вам нужно установить режим привязки = два пути, или сбор не изменится, как только кто-то отметит флажок. Я также рекомендовал бы использовать команду для обработки события Tap на флажке, чтобы вы могли обрабатывать в ViewModel, а не код позади. Вот мой краткий пример редактировался предыдущих решений, я отвечал:


// Namespaces used 
using System.Collections.ObjectModel; // ObservableCollection<T> 
using System.ComponentModel; // INotifyPropertyChanged 


// sample_data class 
public class sample_data : INotifyPropertyChanged 
{ 
    // simple constructor 
    public sample_data(string noteName, Boolean checkboxState) 
    { 
     this.NoteName = noteName; 
     this.CheckboxState = checkboxState; 
    } 

    // implement the INotify 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (null != handler) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    // {Binding Properties} 
    Boolean checkbox_state; 
    public Boolean CheckboxState 
    { 
     get { return checkbox_state; } 
     set { checkbox_state = value; NotifyPropertyChanged("CheckboxState"); } 
    } 

    string note_name; 
    public string NoteName 
    { 
     get { return note_name; } 
     set { note_name = value; NotifyPropertyChanged("NoteName"); } 
    } 

} 

// create a sample set of data to show 
private ObservableCollection<sample_data> CreateData() 
{ 
    ObservableCollection<sample_data> my_list = new ObservableCollection<sample_data>(); 
    my_list.Add(new sample_data("one", false)); 
    my_list.Add(new sample_data("two", true)); 
    my_list.Add(new sample_data("three", false)); 
    my_list.Add(new sample_data("four", true)); 
    my_list.Add(new sample_data("five", false)); 
    my_list.Add(new sample_data("six", true)); 
    my_list.Add(new sample_data("seven", false)); 
    my_list.Add(new sample_data("eight", true)); 
    return my_list; 
} 

public MainPage() 
{ 
    InitializeComponent(); 
    MainListBox.ItemsSource = CreateData(); // set the data bind 

} 


/// You can loop through the items like this, use any convention you want. 
private void LoopThroughItems() 
{ 
    foreach (sample_data sd in MainListBox.ItemsSource) 
    { 
     Boolean is_check = sd.CheckboxState; 
    } 
} 

Ваш DataTemplate нужно изменить так Databinds флажок с двухсторонним связывания.

<DataTemplate x:Key="NotesListBoxItemTemplate"> 
     <Grid HorizontalAlignment="Stretch"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.5*"/> 
       <ColumnDefinition Width="3*"/> 
      </Grid.ColumnDefinitions> 
      <CheckBox Grid.Column="0" IsChecked="{Binding CheckboxState, Mode=TwoWay}" Grid.Row="0" Grid.RowSpan="2" x:Name="chkDelete" Visibility="Visible" Margin="0,36,0,0" /> 
      <TextBlock Text="{Binding NoteName}" FontSize="{StaticResource PhoneFontSizeLarge}" FontFamily="Segoe WP" Grid.Row="0" Grid.Column="1" Margin="12,24,0,0" /> 
     </Grid> 
    </DataTemplate> 

Sample 8.0 Application running above code

+0

Отлично ... Его работал для меня. Огромное спасибо. –

+0

Нет проблем. На самом деле я надеюсь, что вы получите намного больше от кода, а просто получите статус проверки. Мне кажется, что многие кодеры на SO имеют проблемы с пониманием привязки и шаблонов данных. Удачи. –