在单个ItemsControl中按顺序“对齐”两个单独列表的最有效方法是什么?

时间:2013-04-09 04:34:49

标签: c# wpf itemscontrol

出于本示例的目的过度简化我们的模型,我们假设我们有两个数据列表,ListA和ListB,它们都是List<string>类型。从数据的角度来看,它们并不相关。 ListA和ListB可以独立添加,删除或以其他方式更新。

我们要做的是在同一个列表中同时显示它们,按顺序位置对齐。

我们的第一种方法是创建一个新的ListMapping对象,如下所示:

public class ListMapping
{
    public int Index{ get; set; }
    public string StringA{ get; set; }
    public string StringB{ get; set; }
}

然后创建一个List<ListMapping>来关联序号位置的字符串&#39; x&#39; ListA和ListB的开头,我们就像这样初始化它:

var MappedList = new List<ListMapping>();
var maxItems = Math.Max(ListA.Count, ListB.Count);
for(int index = 0; index < maxItems; index++)
{
    var lm = new ListMapping(){
        Index   = index,
        StringA = (index < ListA.Count) ? ListA[index] : null;
        StringB = (index < ListB.Count) ? ListB[index] : null;
    }
    MappedList.Add(lm);
}

这种方法的问题是我们必须手动管理这个新的ListMap对象列表。如果一个项目从ListB中删除,那么我们需要手动将所有ListMapping.StringB属性上移一个位置以重新排列&#39;使用新的ListMapping.StringA。与Insert等相同的事情

我们的下一个方法是实际上不将字符串值存储在ListMapping中,只存储在索引中,并使getter直接从底层列表返回值,如下所示......

public class ListMapping
{
    public int Index{ get; set; }
    public string StringA{ get{ (Index < ListA.Count) ? ListA[Index] : null; } }
    public string StringB{ get{ (Index < ListB.Count) ? ListB[Index] : null; } }
}

然后我们像这样初始化List<ListMapping>对象......

var MappedList = new List<ListMapping>();
var maxItems = Math.Max(ListA.Count, ListB.Count);
for(int index = 0; index < maxItems; index++)
{
    var lm = new ListMapping(){
        Index   = index
    }
    MappedList.Add(lm);
}

使用这种设计,我们只需触发任何ListMapping的StringA和StringB属性的属性更改通知,其索引可能受到ListA或ListB上的操作的影响。绝对更清晰,没有对源对象的引用,但现在他们必须引用List对象本身。另外,我们仍然需要手动管理ListMapping项目的整体列表,以确保至少有最多的项目符号。物品在任何时候。更好,但不理想。

我无法帮助,但是想知道是否有一种方法可以构建一个ItemsControl来拥有两个ItemsSource属性然后使用它的布局面板和ItemContainerGenerator做一些聪明的事情,但这似乎就像我一样在UI中完成我在数据中已经做过的事情。

那么,关于解决这个问题的方法有什么想法吗?

0 个答案:

没有答案