实体的列表框的WPF MVVM内容依赖于实体的另一个列表框
本文关键字:实体 列表 依赖于 另一个 WPF MVVM | 更新日期: 2023-09-27 18:26:00
业务规则:职位可以由空缺填补,其中可以分配与空缺匹配的候选人。一个开幕式需要一个资格。一个候选人可以有许多资格,而一个资格可能由许多候选人获得,因此颁发联合证书是为了避免多对多的关系。
问题:主窗口显示资格、候选人和职位。为了添加位置,我单击"添加位置窗口",它有一个PlacementModel的DataContext和一个"出现新窗口",其中有2个列表框和一个用于完成添加的按钮,用户必须在列表框中选择一个空缺,并在另一个列表框中显示资格匹配的候选人列表。2个列表框的绑定路径分别是Openings和Certificates。每当我单击打开时,我想使证书列表框更新其列表。
实体包括候选人、资格、职位、证书和职位空缺。
我该如何实现?
列表框绑定路径:
LstOpenings(ItemsSource=Openings,SelectedItem=SelectedOpening)
LstCertificates(ItemsSource=证书,SelectedItem=SelectedCertificate)
放置模型:
#region Public Interface
public ObservableCollection<OpeningModel> Openings { get; private set; }
public ObservableCollection<CertificateModel> Certificates { get; private set; }
public OpeningModel SelectedOpening { get { return _selectedOpening; } set { _selectedOpening = value; } }
public CertificateModel SelectedCertificate
{
get { return _selectedCertificate; }
set
{ _selectedCertificate = value;
}
}
#endregion
#region Private Helper
private void GetOpenings()
{`enter code here`
var all = _context.Openings.OrderBy(cust => cust.OpeningDescription).ToList()
.Select(
opening =>
new OpeningModel(opening, _context, _openingRepository, _companyRepository,
_qualificationRepository,_certificateRepository));
Openings = new ObservableCollection<OpeningModel>(all);
ICollectionView view = CollectionViewSource.GetDefaultView(Openings);
view.SortDescriptions.Add(new SortDescription( "OpeningDescription",ListSortDirection.Ascending));
}
private void GetCertificates()
{
if (_selectedOpening == null)
{
Certificates = new ObservableCollection<CertificateModel>();
}
else
{
var all =_certificateRepository.GetCertificates().Where(c => c.QualificationCode == _selectedOpening.QualificationCode)
.OrderBy(c => c.Qualification.QualificationDescription)
.ToList().Select(c=>new CertificateModel(c,_context,_certificateRepository,_candidateRepository,_qualificationRepository));
Certificates = new ObservableCollection<CertificateModel>(all);
ICollectionView view = CollectionViewSource.GetDefaultView(Certificates);
view.SortDescriptions.Add(new SortDescription("QualificationDescription", ListSortDirection.Descending));
}
}
#endregion
添加一个名为Opening
的OpeningModel
类型的新属性,并将其数据绑定到ListBox.SelectedItem
属性:
<ListBox ItemsSource="{Binding Openings}" SelectedItem="{Binding Opening}" ... />
现在,只要Opening
值发生更改,您就需要更新Certificates
集合。您可以从Opening
属性设置器中执行此操作
public OpeningModel Opening
{
get { return opening; }
set
{
opening = value;
NotifyPropertyChanged("Opening");
UpdateCertificates();
}
}
我将由您来完成UpdateCertificates
方法,因为我相信您知道如何做到这一点。