【问题标题】:WPF MVVM content of Listbox of an Entity depends on another Listbox of an Entity一个实体的列表框的 WPF MVVM 内容依赖于一个实体的另一个列表框
【发布时间】:2014-12-04 07:00:24
【问题描述】:

业务规则: 一个职位可以由一个职位空缺来填补,一个与职位空缺匹配的候选人可以被分配。 一个开口需要一个资格。 一个候选人可以有多个资格,并且一个资格可能由多个候选人获得,因此制作了关联证书以避免多对多关系。

问题: 主窗口显示资格、候选人和安置。为了添加展示位置,我单击具有 PlacementModel 数据上下文的添加展示位置窗口,并出现一个新窗口,其中包含 2 个列表框和一个用于完成添加的按钮,用户必须在列表框中选择一个开口和一个有资格的候选人列表匹配项出现在另一个列表框中。 2 列表框的绑定路径分别是Openings 和Certificates。 我想让证书列表框在我单击打开时更新其列表。

实体是候选人、资格、安置、证书和开放。

我该如何实现?

ListBoxes 绑定路径:

LstOpenings(ItemsSource = Openings, SelectedItem= SelectedOpening)

LstCertificates(ItemsSource = Certificates, 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

【问题讨论】:

    标签: c# wpf entity-framework mvvm listbox


    【解决方案1】:

    添加一个名为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 方法,因为我相信你知道怎么做。

    【讨论】:

    • 抱歉,我不知道我应该在 UpdateCertificates() 中放什么。我尝试在我的 GetCertificates() 方法中使用代码,但假设选择的开口永远不会为空,因此如果条件不再适用。这种方法不起作用,所以我真的不知道在 UpdateCertificates 中放什么,这将使证书列表框在我每次单击开口时过滤掉不合格的候选人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多