【发布时间】:2019-02-16 08:22:27
【问题描述】:
我不断收到此错误: System.Windows.Data 错误:40: BindingExpression 路径错误:
System.Windows.Data 错误:40:BindingExpression 路径错误:
在 'object' ''MainWindow' (Name='')' 上找不到'ViewModels' 属性。
BindingExpression:Path=ViewModels.EventViewModel.EventName;
DataItem='MainWindow' (Name='');
目标元素是'ComboBox' (Name='EventNameComboBox');
目标属性为“SelectedItem”(类型为“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;
}
}
最后,
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));
}
}
我不确定发生了什么。
更新
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;
}
【问题讨论】:
-
你能告诉你在哪里设置数据上下文吗?
-
@Lance 好的,我添加了 MainWindow.xaml.cs
-
@Lance 这也很奇怪,因为当我第一次运行项目时它看起来正在工作,但是在它决定它不会做任何事情之后,当我在 ComboBox 中选择不同的项目时它就像验证规则未更新 XAML 以清除旧的验证错误
标签: c# wpf xaml material-design-in-xaml