C#UWP:访问列表视图中的文本块和复选框状态

时间:2018-11-06 11:14:07

标签: c# uwp

嗨,我的列表视图如下: ![] [1]

<RelativePanel >
    <ListView x:Name="StudentListView"
              IsItemClickEnabled="True" 
              Width="1000"
              ItemClick="Student_ItemClick" >
         <ListView.ItemTemplate>
            <DataTemplate x:Name="ABC">
            <StackPanel 
                 x:Name="ListItemPanel"
                 Orientation="Horizontal"  
                 MaxWidth="500">
                 <TextBlock  x:Name ="uName" Text="{Binding Username}" 
                            Margin="20,0,20,8"
                            FontSize="24" 
                            FontStyle="Italic" 
                            FontWeight="SemiBold"
                            Foreground="DarkBlue" 
                            /> 
                 <CheckBox Name="AttendCheckBox" 
                           HorizontalAlignment="Left"
                           Checked="AttendCheckBox_Checked" 
                           IsChecked="False"></CheckBox>
                   </StackPanel>
               </DataTemplate>
           </ListView.ItemTemplate>
       </ListView>
    <TextBlock Name="queryName" FontSize="20"></TextBlock>

    <Button Name="finishBtn" Content="Finish" RelativePanel.Below="StudentListView" ></Button>
</RelativePanel>

我试图访问每个数据项,并在用户单击与listview位于同一页面上的完成按钮时检查是否选中了复选框。而且我很难解决这个问题。关于它的任何提示都会很棒。谢谢

1 个答案:

答案 0 :(得分:0)

我检查了您的代码。您不需要使用CheckBox的Checked事件。相反,您可以在自定义类中声明布尔类型属性,并将IsChecked绑定到该属性并设置Mode=TwoWay,然后,一旦复选框的IsChecked值更改,源代码也将被更新。 。之后,您可以过滤源以获取“ IsChecked = True”项。

根据您的代码段,我制作了一个代码示例供您参考:

<RelativePanel>
        <ListView x:Name="StudentListView"
              IsItemClickEnabled="True" 
                      Width="1000" Height="500">
        <ListView.ItemTemplate>
            <DataTemplate x:Name="ABC">
                <StackPanel 
                            x:Name="ListItemPanel"
                            Orientation="Horizontal"  
                            MaxWidth="500">
                    <TextBlock  x:Name ="uName" Text="{Binding Username}" 
                                   Margin="20,0,20,8"
                                   FontSize="24" 
                                   FontStyle="Italic" 
                                   FontWeight="SemiBold"
                                   Foreground="DarkBlue"/>
                    <CheckBox Name="AttendCheckBox" HorizontalAlignment="Left"  IsChecked="{Binding IsSelected,Mode=TwoWay}"></CheckBox>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <TextBlock Name="queryName" FontSize="20"></TextBlock>

        <Button Name="finishBtn" Content="Finish" RelativePanel.Below="StudentListView" Click="{x:Bind finishBtn_Click}"></Button>
    </RelativePanel>
public sealed partial class MainPage : Page
{

    public ObservableCollection<Test> tests { get; set; }
    public MainPage()
    {
        this.InitializeComponent();
        tests = new ObservableCollection<Test>();
        for (int i=0;i<100;i++)
        {
            tests.Add(new Test() {Username="name "+i });
        }
        StudentListView.ItemsSource = tests;
    }

    private void finishBtn_Click(object sender, RoutedEventArgs e)
    {
        var selectedStudents = tests.Where(x => x.IsSelected == true).ToList();
    }
}
public class Test : INotifyPropertyChanged
{
    private string _Username;
    public string Username
    {
        get { return _Username; }
        set
        {
            if (_Username != value)
            {
                _Username = value;
                RaisePropertyChanged("Username");
            }
        }
    }

    private bool _IsSelected;
    public bool IsSelected
    {
        get { return _IsSelected; }
        set
        {
            if (_IsSelected != value)
            {
                _IsSelected = value;
                RaisePropertyChanged("IsSelected");
            }
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
        }
    }
}