1

我创建了 DevExpress XAF Blazor 应用程序。
我有四个表(页)
第一个是与AssignedContractorCategory表 -oid 字符串 -Title 字符串的一对多相关的类别

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));
    }
}

第二个是与AssignedContractorCategory table -oid string -Title string一对多关联的Contractor

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,与Bill table
-oid string
-FKCategory string
-FKContractor string 一对多关联

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 string
-FKAssignedContractorCategory string
-Amount double

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); }
}

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

4

1 回答 1

2

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

[ImmediatePostData]
public Category Category

第 2 步:Bill类上,将 - 属性添加DataSourceProperty到您的Contractor属性,然后实现一个相应的属性,该属性始终返回正确选择的承包商。请注意,我装饰了新的ContractorSelection-property [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. 为此,您需要更改Category-property 的设置器并告诉 XAF,该Contractor属性也已更改:

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

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


替代方法:

如果你希望你的对象被数据库过滤(如果你有大量的承包商是理想的),你可以使用DataSourceCriteria-attribute 代替,然后ContractorSelection从我的初始解决方案中删除 -property。所有其他代码保持不变:

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-attribute 的 XAF 文档,了解如何在数据源为空的情况下指定适当的行为。
  • 您可能还希望使用Category-setter 来强制执行其他约束,例如将 设置Contractor为 null 以防当前选定Contractor的不是选定类别的一部分。您拥有的相互依赖的属性越多,它就越复杂。
  • 如果您的AssignedContractorCategory类仅用作和之间的纯链接ContractorCategory没有附加属性),那么您可能需要考虑使用 XPO 的集成多对多关联
于 2021-03-22T11:07:58.280 回答