2014-10-09 31 views
0

业务规则: 可以通过开幕式填充展示位置,其中可以分配与开幕相匹配的候选人。 开幕式需要一项资格。 候选人可以有许多资格和许多候选人可以获得资格,所以联合证书是为了避免多对多关系。WPF实体的列表框的MVVM内容取决于实体的另一个列表框

问题: 主窗口显示资格,候选人和安置。为了添加展示位置,我点击具有PlacementModel的DataContext的添加展示位置窗口,并出现一个新窗口,其中有2个列表框和一个用于完成添加的按钮,用户必须在列表框和候选列表中选择一个展开位置,匹配出现在另一个列表框中。 2列表框的绑定路径分别是“开口”和“证书”。 我想让证书列表框更新其列表,每当我点击一个开放。

实体是候选人,资格,安置,证书和开幕。

我该如何执行此操作?

列表框绑定路径:

LstOpenings(的ItemsSource =开口的SelectedItem = SelectedOpening)

LstCertificates(的ItemsSource =证书,的SelectedItem = SelectedCertificate)

PlacementModel:

#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 

回答

0

添加一种名为OpeningOpeningModel类型的新房产和数据绑定t输出给ListBox.SelectedItem属性:

<ListBox ItemsSource="{Binding Openings}" SelectedItem="{Binding Opening}" ... /> 

现在,所有你需要做的就是每当Opening值改变更新Certificates集合。你可以做到这一点从Opening属性setter:

public OpeningModel Opening 
{ 
    get { return opening; } 
    set 
    { 
     opening = value; 
     NotifyPropertyChanged("Opening"); 
     UpdateCertificates(); 
    } 
} 

我会让你来完成UpdateCertificates方法,因为我敢肯定你知道该怎么做。

+0

对不起,但我不知道我应该在UpdateCertificates()里面放什么。 我尝试使用我的GetCertificates()方法内的代码,但假设选择的开放永远不会为空,所以如果条件不再适用。这种方法不起作用,所以我真的不知道应该在UpdateCertificates中放置什么,这会使得证书的列表框在每次单击开始时筛选出不合格的候选人 – 2014-10-09 12:50:48