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

Как я могу управлять ошибка:системе.окна.данные ошибка: 40 : bindingexpression путь ошибка: 'изменили реализацию' имущество не нашел на 'объект' "кур' ?


Привет,

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

модель представления:
public void SaveTeacher(object param)
        {

            using (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand())
            {
              
                RegisterTeacher t = new RegisterTeacher();

                if (isChecked == true || t.CourseName != null)
                {
                    t.CourseName = courseName;

                }
                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);
                       
                }
            }
        }

Это свойство isChecked:
private bool isChecked;
        public bool IsChecked
        {
            get
            {
                return IsChecked;
            }
            set
            {
                if (isChecked != value)
                {
                    isChecked = value;
                    NotifyOnPropertyChange("IsChecked");
                }
            }
        }
        private DelegateCommand checkCommand;
        public DelegateCommand CheckCommand
        {
            get
            {
                if (checkCommand == null)
                    checkCommand = new DelegateCommand(SaveTeacher, null);
                return checkCommand;
            }
            set
            {
                checkCommand = value;
                NotifyOnPropertyChange("CheckCommand");
            }
        }

Это и есть привязка с видом:
<Button Content="Submit" Command="{Binding SaveCommand}"  HorizontalAlignment="Left" Margin="517,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="110" Height="40"/>
        <Button Content="Cancel"  HorizontalAlignment="Left" Margin="361,98.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="111" Height="40"/>
        <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" Click="CheckBoxCourses_Click"
                              IsChecked="{Binding Path=IsChecked,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
                           Command="{Binding CheckCommand,Mode=TwoWay}"

                            Content="{Binding Path=courseName,Mode=TwoWay}" Margin="0"/>


                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Это проверенное событие:
private void CheckBoxCourses_Checked(object sender, RoutedEventArgs e)
        {
            var checkbox = sender as CheckBox;
            if(checkbox!=null)
            {
                checkbox.IsChecked =true;
            }


          
        }


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

В этом и заключается вся ошибка:
System.Windows.Data Error: 40 : BindingExpression path error: 'IsSelected' property not found on 'object' ''Cours' (HashCode=44335814)'. BindingExpression:Path=IsSelected; DataItem='Cours' (HashCode=44335814); target element is 'CheckBox' (Name=''); target property is 'IsChecked' (type 'Nullable`1')

Я пробовал несколько решений с delegatecommand,selecteditem в списке и IsSelected property,свойства только для чтения,ничего не работает.Поскольку я перепробовал много подходов,я переместил свойство IsChecked из view-model в класс модели с именем "Cours" вместе с NotifyPropertyChanged(так что оно в основном выглядит так же,как и в моем примере,только оно находится в модели, а не в виртуальной машине).Может ли кто-нибудь сказать мне, в чем будет заключаться проблема, основанная на этой ошибке?Пожалуйста, сообщите мне, если вам понадобятся определенные строки кода.

Aydin Homay

Привет, пожалуйста, скопируйте также метод CheckBoxCourses_Click, чтобы увидеть, как вы обрабатываете это событие.

Daniel Andrei Popescu

Здравствуйте,спасибо за ваш ответ.Я уже это сделал.

1 Ответов

Рейтинг:
4

Dirk Bahle

1) Посмотрите на окно вывода в VS, когда вы запускаете приложение в отладчике VS - есть ли утверждение об ошибке выражения привязки?

Это могут быть не совсем те буквы и слова, но вы должны увидеть что-то похожее, если есть проблема привязки, которая, как я думаю, может возникнуть у вас здесь...

2) я не вижу привязки SelectedItem - я думаю, что это одна вещь, которую вы используете для манипулирования конкретным элементом в списке.

Надеюсь, это поможет ...


Daniel Andrei Popescu

Спасибо за ваш ответ,я попробую этот подход и вернусь с ответом.Что касается ошибок в этом случае,я не вижу никакой ошибки,все работает отлично, за исключением того, что имя курса равно нулю благодаря флажку.

Dirk Bahle

Эта тема может быть связана с вашей проблемой: https://stackoverflow.com/questions/21193242/wpf-checkedlistbox-how-to-get-selected-item

Daniel Andrei Popescu

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

Daniel Andrei Popescu

Я посмотрел на окно вывода и вижу 2 ошибки для привязки, которые заключаются в следующем:
Система.Окна.Данные ошибка: 40 : BindingExpression путь ошибка: 'собственность CheckCommand' не найден на 'объект' "кур' (хэш-код=1598569)'. BindingExpression:путь=CheckCommand; элемента данных='кур' (хэш-код=1598569); целевой элемент-флажок '' (имя="); целевое свойство 'команда' (тип 'метод ICommand')

Система.Окна.Данные ошибка: 40 : BindingExpression путь ошибка: 'изменили реализацию' имущество не нашел на 'объект' "кур' (хэш-код=1598569)'. BindingExpression:путь=изменили реализацию; элемента данных='кур' (хэш-код=1598569); целевой элемент-флажок '' (имя="); целевое свойство 'этот флажок установлен' (тип 'значение nullable`1).

Dirk Bahle

Хорошо похоже вы находитесь на пути к пониманию своей проблемы с этими ошибками BindingExpression:
Система.Окна.Данные ошибка: 40 : BindingExpression путь ошибка: 'CheckCommand' имущество не нашел на 'объект' "кур'

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

Command="{Binding CheckCommand,Mode=TwoWay}"
. к объекту типа "Cours", но не может этого сделать, потому что свойство command просто отсутствует (или не является общедоступным) в классе "Cours".

Вторая ошибка относится к привязке IsSelected property, которая также не может быть привязана, поскольку отсутствует свойство в viewmodel, прикрепленное к DataContext MainWindow.

Вы не можете ожидать, что привязка команды вызовет обработчик событий: CheckBoxCourses_Checked, поскольку это, хотя и похожие, совершенно разные способы выполнения запроса на обработку.

Вам следует изучить учебник по связыванию MVVM и WPF, основанный на более простых сценариях, чтобы лучше понять, как это работает. Этот учебник может быть полезен:
http://www.wpf-tutorial.com/data-binding/introduction/

Вы увидите аналогичные сообщения об ошибках, когда реализуете один из их примеров, а затем (добровольно) изменяете спецификацию привязки таким образом, чтобы она не находила свойство в viewmodel (например, укажите "XXXX" вместо "IsSelected"). В противном случае, есть много примеров MVVM WPF здесь, на CodeProject.

Dirk Bahle

Было бы полезно, если бы вы могли включить имена классов в свои списки кодов. Вы должны знать, что ListBox элемент привязки, как правило, требуют 2 просмотр моделей:
- тот, который содержит коллекцию, например: ObservableCollection<courseitem> привязан к ItemsSource ListBox (эта модель представления может быть прикреплена к DataContext MainWindow)
- и тот, который представляет собой элемент, который отображается в списке элемента управления ListBox (например: CourseItem)

Вот пример, который демонстрирует, что я имею в виду:
https://www.codeproject.com/Tips/806587/Basic-MVVM-Listbox-Binding-in-WPF

Daniel Andrei Popescu

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