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 仅用作 Contractor
和 Category
之间的纯 link(没有附加属性),那么您可能需要考虑使用 XPO 的集成 many-to-many associations
我已经创建了 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:
[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 仅用作Contractor
和Category
之间的纯 link(没有附加属性),那么您可能需要考虑使用 XPO 的集成 many-to-many associations