C# DevExpress XAF级联查找列表视图

C# DevExpress XAF级联查找列表视图,c#,devexpress,xaf,xpo,C#,Devexpress,Xaf,Xpo,我已经创建了DevExpress XAF Blazor应用程序。 我有四张桌子(页) 第一个是类别,由一对多与指定的承包商类别表关联 -oid字符串 -标题字符串 private string\u Title; 公共字符串标题 { 获取{return\u Title;} set{SetPropertyValue(name of(Title),ref_Title,value);} } [DevExpress.Xpo.Association(“类别指定合同类别”)] 公共XPCollection A

我已经创建了DevExpress XAF Blazor应用程序。
我有四张桌子(页)
第一个是类别,由一对多与指定的承包商类别表关联
-oid字符串
-标题字符串

private string\u Title;
公共字符串标题
{
获取{return\u Title;}
set{SetPropertyValue(name of(Title),ref_Title,value);}
}
[DevExpress.Xpo.Association(“类别指定合同类别”)]
公共XPCollection AssignedContractor类别
{
得到
{
return GetCollection(name of(AssignedContractorCategory));
}
}
第二个是承包商,由一对多与指定的承包商类别
-oid字符串
-标题字符串

private string\u Title;
公共字符串标题
{
获取{return\u Title;}
set{SetPropertyValue(name of(Title),ref_Title,value);}
}
[DevExpress.Xpo.协会(“承包商指定的承包商类别”)]
公共XPCollection AssignedContractor类别
{
得到
{
return GetCollection(name of(AssignedContractorCategory));
}
}
第三个是指定的合同类别,由一对多与账单表格
关联 -oid字符串
-类别字符串
-FK承包商字符串

private-Category\u-Category;
[协会(“类别指定合同或类别”)]
公共类别
{
获取{return\u Category;}
set{SetPropertyValue(name of(Category),ref_Category,value);}
}
私人承包商(u承包商),;
[协会(“承包商指定的承包商类别”)]
公共承包商
{
获取{return\u Contractor;}
设置{SetPropertyValue(承包商名称,参考承包商,值);}
}
第四个是比尔 -oid字符串
-FKSassignedContractorCategory字符串
-双倍

private-Category\u-Category;
公共类别
{
获取{return\u Category;}
set{SetPropertyValue(name of(Category),ref_Category,value);}
}
私人承包商(u承包商),;
公共承包商
{
获取{return\u Contractor;}
设置{SetPropertyValue(承包商名称,参考承包商,值);}
}
私人双倍金额;
公共双倍金额
{
获取{return\u Amount;}
set{SetPropertyValue(nameof(Amount),ref_Amount,value);}
}
在账单页面上,我想显示:
类别(查阅列表视图),在我选择一个类别后,它只显示与表AssignedContractor类别相关的承包商(查阅列表视图)

请注意,我是一名初学者。

步骤1:在您的
账单
类中,用
即时播客数据
属性装饰
类别
-属性。它将确保在UI上的每次更改后立即调用setter:

[ImmediatePostData]
public Category Category
步骤2:
Bill
类上,将
DataSourceProperty
-属性添加到
Contractor
属性,然后实现相应的属性,该属性始终返回正确的Contractor选择。请注意,我用
[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();
    }
}
我测试了这个,它在XAF Blazor中运行良好


替代方法:

如果您希望对象由DB过滤(如果您有大量Contractor集合,则这是理想的选择),则可以改用
datasourceceriteria
-属性,然后从初始解决方案中删除
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文档,了解如何在数据源为空时指定适当的行为
  • 您可能还希望使用
    类别设置器来强制执行其他约束,例如,如果当前选择的
    承包商
    不是所选类别的一部分,则将
    承包商
    设置为null。你拥有的相互依赖的属性越多,它就越复杂
  • 如果您的代码> AsgigeDebug类别类仅用作<代码>承包者< /代码>和<代码>类别< /代码>(没有附加属性)之间的纯链接,那么您可能需要考虑使用XPO的集成

我真的非常感谢你的帮助
private Contractor _Contractor;
[DataSourceCriteria("AssignedContractorCategory[Category = '@This.Category'].Count > 0")]
public Contractor Contractor
{
    get { return _Contractor; }
    set { SetPropertyValue(nameof(Contractor), ref _Contractor, value); }
}