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

Привязка не работает в приложении WPF


Привет,

Недавно я перенес свой проект с одного компьютера на другой, и с тех пор начался ад.В настоящее время у меня есть проблема с моей привязкой,хотя в последней версии все работало правильно.Так что проблема в моем случае на данный момент-это мой combobox.Я использую MVVM, и у меня есть метод, который я передаю в DelegateCommand и, наконец, в само представление.Это мой метод:

public void CreateCrazy(object para)
       {
           var retur = new List<AvailableCours>();
           using (AnotherDbEntities db = new AnotherDbEntities())
           {
               try
               {
                   var testing = Education;
                   var query = (from data in db.AvailableCourses where data.education == Education select new { CourseName = data.courseName }).ToList().Select(c => new AvailableCours { courseName = c.CourseName }).ToList();
                   retur = query;
               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);
               }
           }
           Courses = new ObservableCollection<AvailableCours>(retur);
       }

В основном метод показывает все курсы, доступные для этой конкретной программы.У меня есть программы, перечисленные в combobox(так что привязка с combobox правильна), но у меня есть проблема, когда я нажимаю кнопку, и я хочу, чтобы мои курсы отображались.Теперь это привязка в представлении:

Смотреть.язык XAML.в CS

RegisterTeacherViewModel regTeacher;
       Object obj = new object();


       public Register()
       {
           InitializeComponent();
           regTeacher = new RegisterTeacherViewModel();
           this.DataContext = regTeacher;

           cbxCourses.ItemsSource = regTeacher.GetByEducation();
           //coursesList.ItemsSource = regTeacher.GetByEducation();
           //regTeacher.CreateCrazy(ShowCourse);

       }

Смотреть.язык XAML

<ComboBox HorizontalAlignment="Left"  x:Name="cbxCourses"  SelectedItem="{Binding Education}" Margin="126,229.2,0,0"
                IsSynchronizedWithCurrentItem="True" Grid.Row="2" VerticalAlignment="Top" DisplayMemberPath="education"  Width="228" Grid.RowSpan="2"/>
       <Button Content="Submit" Command="{Binding Path=SaveCommand,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" CommandParameter="{Binding ElementName=coursesList}"  HorizontalAlignment="Left" Margin="517,98.4,0,0" Grid.Row="3" VerticalAlignment="Top" Width="110" Height="40"/>
       <Button Content="Cancel"  HorizontalAlignment="Left" Margin="361,98.4,0,0" Grid.Row="3" VerticalAlignment="Top" Width="111" Height="40"/>

       <Button Content=">>" Name="ShowCourse"  CommandParameter="{Binding ElementName=cbxCourses,Path=SelectedValue}" Command="{Binding MergeCommand,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="422,216.2,0,0" Grid.Row="2" VerticalAlignment="Top" Width="84" Height="33" Grid.RowSpan="2"/>

Здесь у меня есть привязка с combobox,где я привязываю значение education, а последняя кнопка-это кнопка с курсами.Когда я нажимаю кнопку,курсы должны отображаться,а вместо этого ничего нет.Я поставил точку останова,чтобы увидеть точную проблему ,и то, что я заметил, было то, что когда я заменяю data.education="ICT Engineering", я вижу, что курсы добавляются в список курсов.Когда у меня есть data.education=Образование,ничего не происходит.В чем же тогда проблема?Я дважды проверил значения,привязку,все, но, похоже, не могу найти проблему.Любой совет будет оценен по достоинству!

Это и есть "образовательная" ценность в том случае, если она актуальна:

 public String education = string.Empty;
        public String Education
        {
            get { return education; }
            set
            {
                education = value;
                NotifyOnPropertyChange("Education");
            }
        }

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

        public RegisterTeacherViewModel()
        {
            mergeCommand = new DelegateCommand(CreateCrazy);
            saveCommand = new DelegateCommand(SaveTeacher);
            Courses = new ObservableCollection<AvailableCours>();
}



Моя проблема заключается в том,что когда я отлаживаю и ставлю точку останова в строке кода,где появляется образование, оно ломается, не входя в представление, хотя оно должно было бы сломаться, когда я выбрал значение из выпадающего списка.Это мой метод воспитания:
public IEnumerable<AvailableCours> GetByEducation()
        {

            using (var context = new AttendanceStudentsEntities())
            {
                var query = (from data in context.AvailableCourses select new { Education = data.education }).ToList().Select(c => new AvailableCours { education = c.Education }).ToList();

                return query.ToList();

            }

        }

Это привязка в представлении.xaml:
<ComboBox HorizontalAlignment="Left"  x:Name="cbxCourses"  SelectedItem="{Binding Education}" Margin="126,229.2,0,0"
                IsSynchronizedWithCurrentItem="True" Grid.Row="2" VerticalAlignment="Top" DisplayMemberPath="education"  Width="228" Grid.RowSpan="2"/>




Вместе с DataContext в В посмотреть.язык XAML.в CS :
общественности частичного Класс Регистра : окна
{
RegTeacher RegisterTeacherViewModel ;
Object obj = новый объект();


государственный реестр()
{
метод InitializeComponent();
regTeacher = новый RegisterTeacherViewModel();
этот.DataContext = regTeacher;

cbxCourses.ItemsSource = regTeacher.GetByEducation();//здесь я получаю все программы из базы данных.
//список курсов.ItemsSource = regTeacher.GetByEducation();
//регтич.CreateCrazy(ShowCourse);

}

}

Что я уже пробовал:

Я пробовал с ElementName для того, чтобы связать элемент управления ListBox(там, где отображаются курсы)с кнопкой,updatesourcetrigger для привязки и я назначил свойство ItemsSource в ComboBox в представлении.язык XAML.КС.

2 Ответов

Рейтинг:
2

Dirk Bahle

Вы должны скомпилировать и запустить свой проект в режиме отладки в VS и использовать свое приложение как можно лучше. Видите ли вы подобную ошибку, как сообщалось здесь Как я могу управлять ошибка:системе.окна.данные ошибка: 40 : bindingexpression путь ошибка: 'изменили реализацию' имущество не нашел на 'объект' "кур' ?[^] ?

Система.Окна.Данные ошибка: 40 : BindingExpression путь ошибка: 'CheckCommand имущества не

Если да, то теперь вы должны быть в состоянии увидеть отсутствующее свойство или почему привязка не работает.

Если нет, то вы также можете установить точки останова в сеттере свойств, где отсутствует привязка. Работают ли сеттеры так, как ожидалось? Является ли заданное значение ненулевым или оно равно нулю (позже также будет объяснено, почему ваша привязка не работает).


Daniel Andrei Popescu

Спасибо Вам за вашу помощь response.No-теперь моя ошибка в другом.Я установил точку останова,но значение равно нулю,но когда я заменяю ее строкой,она работает, принимая курсы для программы, которую я только что написал в виде строки.Проблема в том,что привязка правильная,я не получаю никаких ошибок, и когда у меня был проект на предыдущем ПК, он работал отлично.Во всяком случае, я заметил, что моя база данных создается дважды каждый раз, когда я делаю новую.Может быть, это и есть проблема?

Dirk Bahle

Итак, мы устранили 2 возможные проблемы - третья часто возникающая проблема заключается в том, что ваша viewmodel не реализует интерфейс INotifyPropertyChanged, что, в свою очередь, иногда приводит к описываемой вами ситуации:

- значение отображается, если время удачно (на вашем старом cumputer)
- значение не отображается, если время таково, что представление построено и значение изменяется (без уведомления) в модели представления после построения представления.

Общественного недействительными CreateCrazy(объект пункт) метод выглядит странно для меня. Попробуйте использовать наблюдаемую коллекцию без нового конструктора каждый раз, когда вы выполняете метод. Вместо этого вы должны:
1 - Создайте ObservableCollection в вашем стандартном конструкторе (только один раз)
2 - Используйте методы Clear(), Add(), Remove() для манипулирования данными в коллекции

Это как-то меняет вашу проблему?

Рейтинг:
1

Graeme_Grant

Courses = new ObservableCollection<AvailableCours>(retur);
Если Courses переменная уже создана, приведенная выше строка кода нарушит привязку и новые элементы не будут отражены в представлении.

Итак, чтобы исправить это, вам нужно сначала проверить, создана ли переменная. Если это так, то вам нужно очистить коллекцию перед добавлением:
if (Courses == null)
    Courses = new ObservableCollection<AvailableCours>();
else
    Courses.Clear();

foreach (var item in retur)
    Courses.Add(retur);


Daniel Andrei Popescu

Спасибо вам,сэр, за ваш ответ, но, к сожалению, он не работает.Я все еще ничего не получаю, когда нажимаю на кнопку.

Daniel Andrei Popescu

Сэр,теперь я заметил,что когда я хочу отладить и устанавливаю точку останова для метода, где я получаю образование в combobox, он врывается прямо в него, не входя в приложение и не ломаясь, когда я выбираю образование.В чем может быть проблема?Я посмотрел на переплет, и все в порядке.