'WPF Data Binding Errors Getting a System.Windows.Data Error: 40
I keep getting this Error: System.Windows.Data Error: 40 : BindingExpression path error:
System.Windows.Data Error: 40 : BindingExpression path error:
'ViewModels' property not found on 'object' ''MainWindow' (Name='')'.
BindingExpression:Path=ViewModels.EventViewModel.EventName;
DataItem='MainWindow' (Name='');
target element is 'ComboBox' (Name='EventNameComboBox');
target property is 'SelectedItem' (type 'Object')
MainWindow.XAML
<ComboBox Name="EventNameComboBox"
DisplayMemberPath="EventName"
HorizontalContentAlignment="Center"
ItemsSource="{Binding Path=EventViewModels}"
materialDesign:HintAssist.Hint="Select an Event"
SelectionChanged="EventNameComboBox_SelectionChanged"
Width="400">
<ComboBox.SelectedItem>
<Binding Path="ViewModels.EventViewModel.EventName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validationRules:EventNameValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedItem>
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
EventNameValidationRule.cs
public class EventNameValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string eventName = value == null ? "" : value.ToString();
return string.IsNullOrEmpty(eventName)
? new ValidationResult(false, "Please select a Event")
: ValidationResult.ValidResult;
}
}
Finally,
EventViewModel.cs
public class EventViewModel : INotifyPropertyChanged
{
private int _eventId;
private string _eventName;
public int EventId
{
get { return _eventId; }
set
{
_eventId = value;
OnPropertyChanged("EventId");
}
}
public string EventName
{
get { return _eventName; }
set
{
_eventName = value;
OnPropertyChanged("EventName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
I'm not sure what is going on.
UPDATE
MainWindow.xaml.cs
private List<EventViewModel> _eventViewModels;
public List<EventViewModel> EventViewModels
{
get { return _eventViewModels; }
set { _eventViewModels = value; OnPropertyChanged("EventViewModels"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public MainWindow()
{
InitializeComponent();
EventViewModels = new List<EventViewModel>();
int year = 2008;
for (int i = 1; i <= 10; i++)
{
EventViewModel viewModel = new EventViewModel();
viewModel.EventId = i;
viewModel.EventName = $"{year} Test Event";
++year;
EventViewModels.Add(viewModel);
}
DataContext = this;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|