实体的列表框的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

实体的列表框的WPF MVVM内容依赖于实体的另一个列表框

添加一个名为OpeningOpeningModel类型的新属性,并将其数据绑定到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方法,因为我相信您知道如何做到这一点。