出于本示例的目的过度简化我们的模型,我们假设我们有两个数据列表,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中完成我在数据中已经做过的事情。
那么,关于解决这个问题的方法有什么想法吗?