Wpf 同步itemscontrol中项目的位置

Wpf 同步itemscontrol中项目的位置,wpf,itemscontrol,Wpf,Itemscontrol,我试图创建一个WPF控件,它显示两个垂直的“泳道”(左泳道和右泳道)。左侧和右侧都应数据绑定到ViewModel中的两个单独的ObservableCollection。ISkill有一个Name属性和一个SynchronizedWith属性,该属性基本上是对另一个ISkill对象(在相反的集合中)的引用 这两个泳道可以看作是普通的垂直堆叠面板,但是与另一个ISkill对象同步的所有ISkill对象都应该始终垂直对齐(这意味着在某些地方会有空白)。同步的iskill在两个不同的泳道之间也应该有一条

我试图创建一个WPF控件,它显示两个垂直的“泳道”(左泳道和右泳道)。左侧和右侧都应数据绑定到ViewModel中的两个单独的ObservableCollection。ISkill有一个Name属性和一个SynchronizedWith属性,该属性基本上是对另一个ISkill对象(在相反的集合中)的引用

这两个泳道可以看作是普通的垂直堆叠面板,但是与另一个ISkill对象同步的所有ISkill对象都应该始终垂直对齐(这意味着在某些地方会有空白)。同步的iskill在两个不同的泳道之间也应该有一条连接线。附件中的图片可能会更好地展示我正在努力完成的任务

下面是ISkill接口

public interface ISkill
{
    string Name { get; set; }
    ISkill SynchronizedWith { get; set; }
}
我的一个想法是将左侧和右侧绑定到两个ItemsControl,并使用网格作为布局面板。但我不确定布局过程应该如何确定集合中的每个项应该具有哪个Grid.Row-index


非常感谢所有建议,谢谢

我的建议是创建一个专用视图模型,表示此视图中的一个项目。这些视图模型的ObservableCollection应该与现有集合同步。这种方法将简化视图设计

class SyncViewModel
{
    public ISkill RightItem { get;} 
    public ISkill LeftItem { get;}
    //simplifies binding 
    public bool HasLeftItem { return LeftItem!=null; }
    public bool HasRightItem { return RightItem!=null; } 
    public bool HasConnection { return HasLeftItem && HasRightItem; } 
 }   

在我看来,在ISkill界面上设置一个
双层
属性会更容易,它在画布中作为ItemsControl的ItemsPanel提供垂直位置(直接或通过绑定转换器转换)。两边应该始终对齐,例如滚动在一起?我同意Clemens的观点。将所有约束应用于两个集合后,即可计算“级别”。每个约束也可以是一个数据项,并映射到一个可视化。@Gosha是的,两个泳道应该在滚动中同步。这不正是我们有MVVM和视图模型的原因吗?事实上,我现在就是这样做的,效果很好。因此,基本上我有一个SkillRow类,其中包含左技能对象和右技能对象,VM侦听左技能对象和右技能对象集合中的更改。VM有一个SkillRows集合,该集合聚合左侧和右侧集合,并添加新的SkillRows或使用现有行向Left或Right属性添加技能。也许我的解决方案是好的…如果是这样,我想你应该保持目前的设计。这里唯一的复杂性是同步,在ViewModel中处理它感觉更好。我现在将其标记为已接受。我正在开发一个不同的版本,采用@Clemens建议的方法。当它按预期工作时,也许我会发布这个。