如何从wp8中的LongListSelector获取复选框值

时间:2014-08-28 19:08:08

标签: windows-phone-8 longlistselector

我的Longlistselector 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" 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>

我的Longlist选择器是

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

如何遍历项目并在每个项目中获取Checkbox选中状态?以前我使用ListBox并且它正常工作。我可以使用下面的代码

找出每个项目的复选框值
private T FindFirstElementInVisaulTree<T>(DependencyObject parentElement) where T:DependencyObject

作为DependencyObject传递的ListBoxItem。 ListBox的唯一问题是滚动。所以尝试使用LongListSelector。

请如何遍历LongListSelector中的项目。

谢谢

1 个答案:

答案 0 :(得分:1)

您还可以将Data的复选框状态绑定到您的模型。然后你可以循环遍历MainListBox.ItemsSource。如果你这样做,你需要设置绑定模式=双向,或者一旦有人点击复选框,集合将不会改变。我还建议您使用Command来处理Checkbox上的Tap事件,这样您就可以在ViewModel中处理,而不是在Code后面处理。以下是我发布的以前解决方案中的快速示例:


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

Sample 8.0 Application running above code