如果检查了2个或更多值,为什么我只在集合中存储了一个值?

时间:2018-04-18 08:41:52

标签: c# wpf mvvm

之前我曾询问过关于我与复选框绑定的问题。最后向前迈出了一步! :)现在,我想知道以下事情:我有一个名为SelectedCourses的集合,它存储了复选框中选中的所有课程。我的问题是,当我检查2个或更多课程时,它只存储列表中的第一个值,即使我选择了另一个值。我存储值的代码看起来像这样:

public void SaveTeacher(object param)
{
    using (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand())
    {
        Cours c = new Cours();
        RegisterTeacher t = new RegisterTeacher();

        if (c.IsChecked == true)
        {
            foreach(var item in Courses)
            {
                if(item.IsChecked)//here IsChecked is true
                {
                    SelectedCourses = new ObservableCollection<Cours>();
                    SelectedCourses.Add(item);//here I have only one course  
                }
                SelectedCourses.ToList();
            }
        }
        t.SNTeacher = SNTeacher;
        t.UserName = _UserName;
        t.pwd = pwd;
        t.fullName = fullName;
        t.education = education;

        db.RegisterTeachers.Attach(t);

        try
        {
            db.SaveChanges();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

我的收藏是这样的:

private ObservableCollection<Cours> selectedCourses;
public ObservableCollection<Cours> SelectedCourses
{
    get { return selectedCourses; }
    set
    {
        selectedCourses = value;
        NotifyOnPropertyChange("SelectedCourses");
    }
}

我还有一个包含所有课程的集合:

private ObservableCollection<Cours> _courses;
public  ObservableCollection<Cours> Courses
{
    get => _courses;
    set
    {
        _courses = value;
        NotifyOnPropertyChange(nameof(Courses));
    }
}

这是我的系统外观和检查2个值的示例:

enter image description here

这是我设置断点时得到的结果:

enter image description here

正如您所看到的,只有一门课程被添加到SelectedCourses.How我可以这样做,以便它将保存与用户检查一样多的课程? 最后但并非最不重要的是,绑定.xaml:

<ListBox x:Name="coursesList"  SelectedItem="{Binding SelectedCourses}"  
 HorizontalAlignment="Left"  Margin="538,23.2,0,0" Grid.Row="2" 
 VerticalAlignment="Top" Width="225"  ItemsSource="{Binding Courses}" Height="255" Grid.RowSpan="2" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ListBoxItem IsSelected="{Binding IsChecked}">
                <CheckBox x:Name="CheckBoxList" Content="{Binding Path=courseName}" IsChecked="{Binding Path=IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
            </ListBoxItem>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2 个答案:

答案 0 :(得分:2)

在您的代码中,您将在每次迭代中创建一个新的ObservableCollection

试试这样:

if (c.IsChecked == true)
        {
            SelectedCourses = new ObservableCollection<Cours>();

            foreach(var item in Courses)
            {
                if(item.IsChecked)//here IsChecked is true
                {
                    SelectedCourses.Add(item);//here I have only one course  
                }
            }
        }

答案 1 :(得分:1)

我已经设法做了这个方法并向前迈出了一步!对于那些需要的人,这是我用来获取被检查值的方法:

 public void CheckVal()
   {
 SelectedCourses = new ObservableCollection<Cours>();
                foreach (var item in Courses)
                {

                    if (item.IsChecked)
                    {
                        SelectedCourses.Add(item);

                    }
}

这是与视图的绑定:

  <ListBox x:Name="coursesList" SelectionMode="Multiple" 
 HorizontalAlignment="Left"  Margin="538,23.2,0,0" Grid.Row="2" 
  VerticalAlignment="Top" Width="225"  ItemsSource="{Binding Courses}" 
  Height="255" Grid.RowSpan="2" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ListBoxItem  IsSelected="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ElementName=CheckBoxList}">
                <CheckBox x:Name="CheckBoxList" Content="{Binding Path=courseName}" IsChecked="{Binding Path=IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                </ListBoxItem>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

其余的是相同的(2个集合和IsChecked值):)。希望它对别人有所帮助。谢谢你们的帮助!