Почему мое проверенное значение bool из checkbox является ложным ?
Привет,
У меня проблема с моим проектом.У меня есть регистрационная форма с combobox и listbox.В списке у меня есть флажки для выбора конкретных курсов.Моя проблема заключается в отладке,потому что каждый раз, когда я выбираю значение с флажком, а затем хочу сохранить его, я вижу, что свойство Checked имеет значение false.Это моя точка зрения:
<ListBox HorizontalAlignment="Left" Name="coursesList" Height="240" Margin="418,13.2,0,0" Grid.Row="1" VerticalAlignment="Top" Width="225" Grid.RowSpan="2" ItemsSource="{Binding Courses}" > <ListBox.ItemTemplate> <DataTemplate> <CheckBox x:Name="CheckBoxCourses" IsChecked="{Binding Path=Checked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ClickMode="Press" Content="{Binding Path=courseName}" Margin="0"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
Это моя точка зрения-модель:
using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1()) { RegisterTeacher t = new RegisterTeacher(); if(Checked==true) { t.CourseName = courseName; } t.SNTeacher = SNTeacher; t.UserName = _UserName; t.pwd = pwd; t.fullName = fullName; Cours c = new Cours(); c.education = education; db.RegisterTeachers.Attach(t); db.Courses.Add(c); try { db.SaveChanges(); }catch(DbEntityValidationException ex) { foreach(var entityValidationErrors in ex.EntityValidationErrors) { foreach(var validationError in entityValidationErrors.ValidationErrors) { MessageBox.Show("Property:" + validationError.PropertyName + "Error:" + validationError.ErrorMessage); } } } }
Что я уже пробовал:
Я использую db first с Entity Framework.В чем может быть проблема?Я проверил свою привязку,и она верна, может быть, мне стоит использовать другой подход в виртуальной машине?
Это моя полная виртуальная машина:
private DelegateCommand mergeCommand; public DelegateCommand MergeCommand { get { return mergeCommand; } set { if (mergeCommand != value) { mergeCommand = value; NotifyOnPropertyChange("MergeCommand"); } } } private String _UserName; public string UserName { get { return _UserName; } set { if (_UserName != value) { _UserName = value; NotifyOnPropertyChange("UserName"); } } } private int pwd; public int Pwd { get { return pwd; } set { if (pwd != value) { pwd = value; NotifyOnPropertyChange("Pwd"); } } } private int SNTeacher; public int SerialNT { get { return SNTeacher; } set { if (SNTeacher != value) { SNTeacher = value; NotifyOnPropertyChange("SerialNT"); } } } private string fullName; public string FullName { get { return fullName; } set { if (fullName != value) { fullName = value; NotifyOnPropertyChange("FullName"); } } } private string courseName; public string CourseName { get { return courseName; } set { if (courseName != value) { courseName = value; NotifyOnPropertyChange("CourseName"); } } } public String education = string.Empty; public String Education { get { return education; } set { education = value; NotifyOnPropertyChange("Education"); } } private ObservableCollection<Cours> _courses; public ObservableCollection<Cours> Courses { get => _courses; set { _courses = value; NotifyOnPropertyChange(nameof(Courses)); } } public RegisterTeacherViewModel() { mergeCommand = new DelegateCommand(CreateCrazy); saveCommand = new DelegateCommand(SaveTeacher); } private DelegateCommand saveCommand; public DelegateCommand SaveCommand { get { return saveCommand; } set { if (saveCommand != value) { saveCommand = value; NotifyOnPropertyChange("SaveCommand"); } } } public IEnumerable<Cours> GetByEducation() { using (var context = new DatabaseStudentsEntities1()) { var query = (from data in context.Courses select new { Education = data.education }).ToList().Select(c => new Cours { education = c.Education }).ToList(); return query.ToList(); } } private bool isChecked; public bool Checked { get { return isChecked; } set { isChecked = value; NotifyOnPropertyChange("Checked"); } } public void CreateCrazy(object para) { var retur = new List<Cours>(); using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1()) { try { var testing = Education; var query = (from data in db.Courses where data.education == testing select new { CourseName = data.courseName }).ToList().Select(c => new Cours { courseName = c.CourseName }).ToList(); retur = query; } catch (Exception ex) { MessageBox.Show(ex.Message); } } Courses = new ObservableCollection<Cours>(retur); } public void SaveTeacher(object param) { using (DatabaseStudentsEntities1 db = new DatabaseStudentsEntities1()) { RegisterTeacher t = new RegisterTeacher(); if(Checked==true) { t.CourseName = courseName; } t.SNTeacher = SNTeacher; t.UserName = _UserName; t.pwd = pwd; t.fullName = fullName; Cours c = new Cours(); c.education = education; db.RegisterTeachers.Attach(t); db.Courses.Add(c); try { db.SaveChanges(); }catch(DbEntityValidationException ex) { foreach(var entityValidationErrors in ex.EntityValidationErrors) { foreach(var validationError in entityValidationErrors.ValidationErrors) { MessageBox.Show("Property:" + validationError.PropertyName + "Error:" + validationError.ErrorMessage); } } } } }
А это мой класс моделей:
public partial class RegisterTeacher { public RegisterTeacher() { this.Logins = new ObservableCollection<Login>(); } public int SNTeacher { get; set; } public string UserName { get; set; } public int pwd { get; set; } public string fullName { get; set; } public string CourseName { get; set; } public virtual ObservableCollection<Login> Logins { get; set; } }
Graeme_Grant
"каждый раз,когда я выбираю значение с помощью флажка, а затем хочу сохранить его, я вижу, что свойство Checked в false"
Вы вставили код обработки БД, а не ваш ViewModel или класс модели, который содержит данные, упомянутые в привязках DataTemplate ListBox. Вы пробовали установить точку останова в наборе свойств модели для проверяемого свойства?
"форма с combobox и listbox.В списке у меня есть флажки для выбора конкретных курсов"
Ваш код БД же ищет проверенное свойство ViewModel, а не проверенное свойство каждой модели. Какое проверяемое свойство вы тестируете и какова связь между каждым проверяемым свойством модели и основным проверяемым свойством формы?
Daniel Andrei Popescu
Здравствуйте,CourseName-это свойство в флажке,которое я тестирую, и что касается отношений, то я действительно не понимаю, о чем вы говорите.Я все еще новичок в MVVM, поэтому был бы очень признателен, если бы вы перефразировали этот вопрос. :)
Graeme_Grant
Хорошо, я выделил этот вопрос выше для ясности...
Вы пробовали установить точку останова в наборе свойств модели [метод] для проверяемого свойства? Достигнута ли точка останова и выполнение кода приостановлено?
Daniel Andrei Popescu
Привет
Daniel Andrei Popescu
I have tried so many things yesterday and I was too tired at a certain point,I apologize for not answering earlier.I put a breakpoint and saw that the value was false.Initially I had my bool in the view-model.I tried another approach by declaring it in the model class and call it thorugh the reference to the model (reference was t) and i made something like-if(t.isChecked==true).This time I get the bool value in the view when I want to bind it,but still get the value false.I started then wondering that my problem is the binding since everything was working fine except for this.Then I started making some research and tried 3 different approaches of binding a checkbox,including a delegate command and a read-only property.Nothing worked...
Graeme_Grant
У тебя все еще есть проблемы?
Daniel Andrei Popescu
Да,к сожалению. Мне удалось сделать IsCheked==true через delegatecommand,но мое имя курса все еще равно null, когда я хочу вставить это значение в БД.
Daniel Andrei Popescu
public DelegateCommand CheckCommand { get { if (checkCommand == null) checkCommand = new DelegateCommand(i => Checkprocess(i), null); return checkCommand; } set { checkCommand = value; NotifyOnPropertyChange("CheckCommand"); } } private void Checkprocess(object i) { isChecked = true; }
Daniel Andrei Popescu
И метод, используемый для извлечения значения, тот же самый
Graeme_Grant
Извини, здесь было очень оживленно ... вы нашли решение или вам все еще нужна помощь?
Daniel Andrei Popescu
Да,спасибо, что спросили.Я все еще делаю это,я не мог найти проблему.