之前我曾询问过关于我与复选框绑定的问题。最后向前迈出了一步! :)现在,我想知道以下事情:我有一个名为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个值的示例:
这是我设置断点时得到的结果:
正如您所看到的,只有一门课程被添加到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>
答案 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值):)。希望它对别人有所帮助。谢谢你们的帮助!