Posted 10 April 2018, 11:24 pm EST
Hello,
I have a problem from some time with my project and only today I saw in my output window that this error existed(this is after I looked all over in my code and tried different approaches that didn’t work).The error is as follows:
System.Windows.Data Error: 40 : BindingExpression path error: ‘IsSelected’ property not found on ‘object’ ‘‘Cours’ (HashCode=56607127)’. BindingExpression:Path=IsSelected; DataItem=‘Cours’ (HashCode=56607127); target element is ‘CheckBox’ (Name=‘’); target property is ‘IsChecked’ (type ‘Nullable`1’)
I have a listbox and inside it,course names with checkbox.My goal is that when I click in the checkbox and the item is checked,it has to be saved in the db.I learned how to read the error today,but unfortunately it ruins my day because I don’t know the exact problem of it.As a result,I will share with you fellow programmers in hope someone will know how to help me solve it.This is the View-Model(changed version):
class RegisterTeacherViewModel : ViewModelBase, INotifyPropertyChanged
{
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);
// checkCommand = new DelegateCommand(SaveTeacher, null);
}
private bool selectedCourse;
public bool SelectedCourse
{
get { return selectedCourse; }
set
{
selectedCourse =!value;
foreach(var course in Courses)
{
if(course.IsChecked==true)
{
course.IsChecked = selectedCourse;
Courses.Add(course);
}
}
}
}
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 DatabaseStudentsEntitiesLastStand())
{
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 (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand())
{
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);
}
//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");
// }
//}
public void SaveTeacher(object param)
{
using (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand())
{
Cours c = new Cours();
RegisterTeacher t = new RegisterTeacher();
if (c.IsChecked == true && 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);
}
}
}
//using (DatabaseStudentsEntitiesLastStand db = new DatabaseStudentsEntitiesLastStand())
//{
// var query = (from t in db.RegisterTeachers
// select new RegisterTeacher()
// {
// SNTeacher=t.SNTeacher,
// UserName=t.UserName,
// pwd=t.pwd,
// fullName=t.fullName
// }).ToList();
//}
This is the binding with the view:
<Window x:Class="LastAndFinalVersion.View.Register"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LastAndFinalVersion.ViewModel"
xmlns:mm="clr-namespace:LastAndFinalVersion.Helpers"
xmlns:ms="clr-namespace:LastAndFinalVersion.Model"
mc:Ignorable="d"
Title="Register" Height="700" Width="700" FontSize="14" Background="#04c582" HorizontalAlignment="Center">
<Window.DataContext>
<local:RegisterTeacherViewModel/>
</Window.DataContext>
<Grid Margin="20,20,3.6,28.4">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Label Content="Register"
Foreground="White" FontSize="25" HorizontalAlignment="Center" Grid.ColumnSpan="2" Margin="179,0,175.6,0.4"/>
<Separator>
</Separator>
<Label Content="SN:" HorizontalAlignment="Left" Margin="10,13.2,0,0" Grid.Row="1" VerticalAlignment="Top"/>
<Label Content="Username:
" HorizontalAlignment="Left" Margin="10,63.6,0,0" Grid.Row="1" VerticalAlignment="Top" RenderTransformOrigin="-0.833,-0.208"/>
<Label Content="Password:" HorizontalAlignment="Left" Margin="10,111.6,0,0" Grid.Row="1" VerticalAlignment="Top"/>
<Label Content="Full name:
" HorizontalAlignment="Left" Margin="10,158.2,0,0" Grid.Row="1" VerticalAlignment="Top" RenderTransformOrigin="0.651,-0.415"/>
<Label Content="Courses teaching:
" HorizontalAlignment="Left" Margin="0,229.2,0,0" Grid.Row="1" VerticalAlignment="Top" Grid.RowSpan="2"/>
<TextBox HorizontalAlignment="Left" Name="SerialNr" Height="23" Margin="126,13.6,0,0" Grid.Row="1" TextWrapping="Wrap" Text="{Binding SerialNT}" VerticalAlignment="Top" Width="248" Grid.ColumnSpan="2"/>
<TextBox Grid.ColumnSpan="2" Name="UsernameTeacher" HorizontalAlignment="Left" Height="23" Margin="126,63.6,0,0" Grid.Row="1" TextWrapping="Wrap" Text="{Binding UserName}" VerticalAlignment="Top" Width="248"/>
<PasswordBox Name="passwordBox" mm:PasswordHelper.BindPassword="true"
mm:PasswordHelper.BoundPassword="{Binding Path=Pwd, Mode=TwoWay, ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"
PasswordChar="*" HorizontalAlignment="Left" Height="27" Margin="126,111.2,0,0" Grid.Row="1" VerticalAlignment="Top" Width="248"/>
<TextBox HorizontalAlignment="Left" Name="fullName" Height="23" TextWrapping="Wrap" Text="{Binding FullName}" VerticalAlignment="Top" Width="248" Grid.ColumnSpan="2" Margin="126,158.6,0,0" Grid.Row="1" Grid.RowSpan="2"/>
<ComboBox HorizontalAlignment="Left" DataContextChanged="cbxCourses_DataContextChanged" Text="{Binding Education}" x:Name="cbxCourses" SelectedItem="{Binding Education}" Margin="126,229.2,0,0"
IsSynchronizedWithCurrentItem="True" Grid.Row="1" VerticalAlignment="Top" DisplayMemberPath="education" Width="228" Grid.RowSpan="2">
<!--<StackPanel Orientation="Horizontal">
<Image Source="https://www.frostburg.edu/fsu/assets/Image/dept/educ/education_sign_resized.jpg" Height="20"></Image>
<TextBlock Text="Program"></TextBlock>
</StackPanel>-->
</ComboBox>
<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" SelectionMode="Multiple" Name="coursesList" Height="240" SelectedItem="{Binding Path=SelectedCourse}" Margin="418,13.2,0,0" Grid.Row="1" VerticalAlignment="Top" Width="225" Grid.RowSpan="2" ItemsSource="{Binding Courses}" >
<ListBox.ItemTemplate>
<DataTemplate>
<!--<ListBoxItem IsSelected="{Binding Path=IsChecked,ElementName=CheckBoxCourses}">-->
<CheckBox x:Name="CheckBoxCourses" Content="{Binding Path=courseName}"
Margin="0"
IsChecked="{Binding Path=IsSelected,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" >
<!--CommandParameter="{Binding Path=SelectedItem,RelativeSource={RelativeSource AncestorType=ListBox}}"-->
<!--Command="{Binding Path=CheckCommand,Mode=OneWay}"-->
</CheckBox>
<!--</ListBoxItem>-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="Show courses:" Name="ShowCourse" CommandParameter="{Binding ElementName=cbxCourses,Path=SelectedValue}" Command="{Binding MergeCommand}" HorizontalAlignment="Left" Margin="163,61.4,0,0" Grid.Row="2" VerticalAlignment="Top" Width="137" Height="35"/>
</Grid>
</Window>
And this is my model(there i have IsChecked property to which I have a reference in the VM. Initially I made it in the View-Model applying the NotifyPropertyChanged,but since I saw the error today,I moved it here):
public partial class Cours:INotifyPropertyChanged
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Cours()
{
this.RegisterTeachers = new ObservableCollection<RegisterTeacher>();
}
public string courseName { get; set; }
public int SNTeacher { get; set; }
public string education { get; set; }
public string ClassID { get; set; }
public int courseID { get; set; }
private bool isChecked;
public event PropertyChangedEventHandler PropertyChanged;
public bool IsChecked
{
get { return isChecked; }
set
{
if(isChecked!=value)
{
isChecked = value;
NotifyOnPropertyChange("IsChecked");
}
}
}
protected void NotifyOnPropertyChange(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public virtual RegisterTeacher RegisterTeacher { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ObservableCollection<RegisterTeacher> RegisterTeachers { get; set; }
}
}
I provided full info about my code since I don’t know exactly the cause and for better understanding of what I wish to accomplish.