Daniel Andrei Popescu Ответов: 1

Почему мое проверенное значение 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

Да,спасибо, что спросили.Я все еще делаю это,я не мог найти проблему.

1 Ответов

Рейтинг:
1

#realJSOP

Начните с установки точки останова на set метод в вашем Checked свойство, и убедитесь, что привязка, которую вы настроили, действительно работает.


Graeme_Grant

Приятно слышать, что вы повторяете то, что я изначально предложил...

#realJSOP

Я прочитал вопрос и сразу же опубликовал свой ответ, не читая комментариев, так как комментарии обычно не включают в себя решения. На самом деле, я до сих пор не читал комментарии и не собираюсь этого делать. Ваш 1-й голос неуместен.

Graeme_Grant

Почему вы думаете, что я голосовал?.. Я только прокомментировал.