как получить значение флажка из LongListSelector в wp8

Шаблон данных My Longlistselector

 <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.

Спасибо


person Rajeev C    schedule 28.08.2014    source источник


Ответы (1)


Вы также можете привязать состояние флажка к вашей модели. Затем вы можете просто перебрать MainListBox.ItemsSource. Если вы сделаете это таким образом, вам нужно установить Binding Mode = Two Way, иначе коллекция не изменится, когда кто-то коснется флажка. Я бы также рекомендовал вам использовать команду для обработки события 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 необходимо изменить, чтобы он привязывал к данным флажок с двусторонней привязкой.

    <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>

Пример 8.0, работающий с приведенным выше кодом

person Chubosaurus Software    schedule 29.08.2014
comment
Без проблем. Я действительно надеюсь, что вы получили намного больше от кода, чем просто получение статуса проверки. Мне кажется, у многих кодеров на SO есть проблемы с пониманием привязки и шаблонов данных. Удачи. - person Chubosaurus Software; 30.08.2014