DevExpress XAF 级联查找列表视图

问题描述

我已经创建了 DevExpress XAF Blazor 应用程序。
我有四张桌子(页)
第一个是 CategoryAssignedContractorCategory
一对多关联 -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));
    }
}

第二个是ContractorAssignedContractorCategory表的一对多关联
-oid 字符串
-标题字符串

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

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

第三个是AssignedContractorCategory,与Bill表一对多相关
-oid 字符串
-FKCategory 字符串
-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); }
}

第四个是比尔
-oid 字符串
-FKAAssignedContractorCategory 字符串
-金额翻倍

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

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

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

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

解决方法

第 1 步:在您的 Bill 类上,使用 Category 属性装饰 ImmediatePostData 属性。它将确保在 UI 每次更改后立即调用 setter:

[ImmediatePostData]
public Category Category

第 2 步:Bill 类上,将 DataSourceProperty-属性添加到您的 Contractor 属性,然后实现相应的属性,该属性始终返回正确选择承包商。请注意,我使用 ContractorSelection 装饰了新的 [Browsable(false)] 属性,使其在 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-collection 的内部缓存。为此,您需要更改 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),value); }
}

附加信息:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...