改写:我可以使用其他一些想法,建议和示例来构建可绑定数据的集合。集合需要提供一个可数据绑定的,可编辑的项目树,但要稍加改动:这些项目需要是两种类型之一,每种类型都提供略有不同的特征。两种类型的项目是Folder和TreeItem。文件夹包含它自己的项目列表(同样是Folder或TreeItem类型),而TreeItem不包含列表。我当前的方法相当接近,但感觉很脆弱。本质上,我有一个抽象的基类TreeItemBase,它以一种绕行方式继承自BindableList。然后,我有两个具体的派生类型,Folder和TreeItem,它们都从抽象基类继承。明显的缺陷是不能包含子项的TreeItem仍继承自BindingList;因此由一些丑陋的黑客假装这不是一个集合。BindingList 是基于此集合的错误选择吗?某些DataBinding interfaces声音听起来像它们对数据绑定提供了更高程度的控制,但是我还没有找到一个完全正确的方法。不过,我的理想情况是提供一个自定义实现,使我可以控制数据绑定如何遍历集合,并可以检查每个元素的具体类型,以确定它是否包含集合,或者是否是树中的终点。这是XML的简要介绍,可帮助可视化我要表示的内容。我很容易在XSD中干净地编码结构和规则-但是我很难将其转换为.NET并支持数据绑定。<Items> <TreeItem xsi:type="Folder" name="Root"> <TreeItem xsi:type="Folder" name="Sub1"> <TreeItem xsi:type="TreeItem" name="Humm"/> </TreeItem> <TreeItem xsi:type="TreeItem" name="Bleh"/> <TreeItem xsi:type="Folder" name="Sub2"> <TreeItem xsi:type="TreeItem" name="Boo!"/> </TreeItem> </TreeItem></Items>更新:我已经在方法上进行了更多工作,并且已经接近使用接口而不是项目的基类来完成的工作,但是遇到了麻烦。我遇到的问题在seperate question中涵盖。理想情况下,我想使用抽象基类方法,以便生成的XML将Folder和TreeItem视为complexTypes(无需手动控制序列化),但这是可以忽略的要求。 最佳答案 也许我的知识不足以解决这个问题,但是您不能这样做:有一个接口,以及2个实现该接口的类。interface ITreeItem{ IEnumerable<ITreeItem> GetChildren();}class MyFolder : ITreeItem{ public IEnumerable<ITreeItem> GetChildren() { // TODO: Return the list of children }}class MyITreeItem : ITreeItem{ public IEnumerable<ITreeItem> GetChildren() { // TODO: Return the list of children }}然后,如果您的目标是将集合数据绑定到某个列表,则应该能够使用IEnumerable集合。在每个对集合进行数据绑定的调用中,您应该能够查看该项目是哪种类型:foreach (var node in root.GetChildren()){ if (node is MyFolder) { var folder = (MyFolder)node; // Bind fields from the folder object } else if(node is MyTreeItem) { var folder = (MyTreeItem)node; // Bind fields from the tree item object }}当我有一个嵌套在另一个列表中的列表时,我做了类似的事情(我认为)。为了显示数据,我设置了嵌套ListView控件。抱歉,这不是您想要的,但希望对您有所帮助!关于c# - .NET数据绑定(bind)-用于文件夹和项目的递归树的自定义数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1266902/
10-13 06:45