问题描述
我已经创建了 DevExpress XAF Blazor 应用程序。
我有四张桌子(页)
第一个是 Category 与 AssignedContractorCategory 表
一对多关联
-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与AssignedContractorCategory表的一对多关联
-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
类仅用作Contractor
和Category
之间的纯链接(没有附加属性),那么您可能需要考虑使用 XPO 的集成 many-to-many associations