DevExpress XAF 级联查找列表视图

DevExpress XAF Cascading Lookup List Views

我已经创建了 DevExpress XAF Blazor 应用程序。
我有四个 tables(pages)
第一个是 Category,由 one-to-many 与 AssignedContractorCategory table
相关 -oid 字符串
-标题字符串

private string _Title;
public string Title
{
    get { return _Title; }
    set { SetPropertyValue(nameof(Title), ref _Title, value); }
}

[DevExpress.Xpo.Association("Category-AssignedContractorCategory")]
public XPCollection<AssignedContractorCategory> AssignedContractorCategory
{
    get
    {
        return GetCollection<AssignedContractorCategory>(nameof(AssignedContractorCategory));
    }
}

第二个是 Contractor,由 one-to-many 与 AssignedContractorCategory table
相关 -oid 字符串
-标题字符串

private string _Title;
public string Title
{
    get { return _Title; }
    set { SetPropertyValue(nameof(Title), ref _Title, value); }
}

[DevExpress.Xpo.Association("Contractor-AssignedContractorCategory")]
public XPCollection<AssignedContractorCategory> AssignedContractorCategory
{
    get
    {
        return GetCollection<AssignedContractorCategory>(nameof(AssignedContractorCategory));
    }
}

第三个是 AssignedContractorCategory,由 one-to-many 与 Bill table
相关 -oid 字符串
-FK类别字符串
-FKContractor 字符串

private Category _Category;
[Association("Category-AssignedContractorCategory")]
public Category Category
{
    get { return _Category; }
    set { SetPropertyValue(nameof(Category), ref _Category, value); }
}

private Contractor _Contractor;
[Association("Contractor-AssignedContractorCategory")]
public Contractor Contractor
{
    get { return _Contractor; }
    set { SetPropertyValue(nameof(Contractor), ref _Contractor, value); }
}

第四个是Bill
-oid 字符串
-FKAssignedContractorCategory 字符串
-数量翻倍

private Category _Category;
public Category Category
{
    get { return _Category; }
    set { SetPropertyValue(nameof(Category), ref _Category, value); }
}

private Contractor _Contractor;
public Contractor Contractor
{
    get { return _Contractor; }
    set { SetPropertyValue(nameof(Contractor), ref _Contractor, value); }
}

private double _Amount;
public double Amount
{
    get { return _Amount; }
    set { SetPropertyValue(nameof(Amount), ref _Amount, value); }
}

我想在账单页面上显示:
类别(查找列表视图),在我选择一个类别后,它仅显示与 table AssignedContractorCategory
相关的承包商(查找列表视图) 请注意我是初学者。

第 1 步: 在你的 Bill class 上,用 [=16= 装饰 Category-属性 ] 属性。它将确保在 UI:

的每次更改后立即调用 setter
[ImmediatePostData]
public Category Category

第 2 步:Bill class 上,将 DataSourceProperty-属性添加到您的 Contractor 属性,然后执行相应的 属性,它总是 returns 正确选择承包商。请注意,我用 [Browsable(false)] 装饰了新的 ContractorSelection-属性,这样它在 XAF UI:

上完全不可见
private Contractor _Contractor;
[DataSourceProperty(nameof(ContractorSelection))]
public Contractor Contractor
{
    get { return _Contractor; }
    set { SetPropertyValue(nameof(Contractor), ref _Contractor, value); }
}

[Browsable(false)]
public IList<Contractor> ContractorSelection
{
    get
    {
       return Category?.AssignedContractorCategory.Select(i => i.Contractor).Distinct().ToList();
    }
}

第 3 步: 现在的问题是,当您更改 Category 时,XAF 不会自动更新其 ContractorSelection 集合的内部缓存。为此,您需要更改 Category-属性 的 setter 并告诉 XAF Contractor 属性 也已更改:

[ImmediatePostData]
public Category Category
{
    get { return _Category; }
    set 
    { 
        SetPropertyValue(nameof(Category), ref _Category, value);
        if (!IsLoading)
        {
            OnChanged(nameof(Contractor));
        }
    }
}

我对此进行了测试,它在 XAF Blazor 中运行良好。


替代方法:

如果您希望您的对象由 DB 过滤(如果您有大量承包商是理想的选择),您可以改用 DataSourceCriteria 属性,然后删除 ContractorSelection -属性 来自我最初的解决方案。所有其他代码保持不变:

private Contractor _Contractor;
[DataSourceCriteria("AssignedContractorCategory[Category = '@This.Category'].Count > 0")]
public Contractor Contractor
{
    get { return _Contractor; }
    set { SetPropertyValue(nameof(Contractor), ref _Contractor, value); }
}

附加信息:

  • 我们还没有定义当没有选择类别时 XAF 应该显示什么。查看 DataSourceProperty 属性的 XAF 文档,了解在数据源为空的情况下如何指定适当的行为。
  • 您可能还想使用 Category-setter 来强制执行其他约束,例如将 Contractor 设置为空,以防当前选择的 Contractor 是不属于所选类别。您拥有的相互依赖的属性越多,它就会变得越复杂。
  • 如果您的 AssignedContractorCategory class 仅用作 ContractorCategory 之间的纯 link(没有附加属性),那么您可能需要考虑使用 XPO 的集成 many-to-many associations