2015-02-10 50 views
2

我試圖創建一個顯示兩個垂直「泳道」(左和右)的WPF控件。 Left和Right都應該綁定到ViewModel中的兩個單獨的ObservableCollection。 ISkill有一個Name屬性和一個可選的SynchronizedWith屬性,它基本上是對另一個ISkill對象的引用(在相反的集合中)。項目控件中的項目位置同步

這兩個泳道可以看作是普通的垂直StackPanels,但是所有與另一個ISkill對象同步的ISkill對象應該始終垂直對齊(這意味着在某些地方會有空的空間)。同步的智齒應該在兩條不同的泳道之間有一條連線。所附的圖片可能會更好地瞭解我正在努力完成的任務。

Vertical Swimlanes

下面是ISkill接口。

public interface ISkill 
{ 
    string Name { get; set; } 
    ISkill SynchronizedWith { get; set; } 
} 

我有一個想法是綁定左和右兩個ItemsControls和使用網格作爲佈局面板。但我不確定佈局傳遞應該如何確定集合中每個項目應具有哪個Grid.Row-index。

所有的建議非常感謝,謝謝!

+0

IMO它會更容易也有ISkill接口,其在用作一個ItemsControl的ItemsPanel畫布供應垂直位置(直接地或通過轉換的結合轉換器)上的雙'屬性Level'。 – Clemens 2015-02-10 10:46:07

+0

兩邊應始終對齊,例如一起滾動? – igorushi 2015-02-10 11:40:46

+0

我同意克萊門斯。在將所有約束應用於兩組之後,可以計算'等級'。每個約束也可以是數據項目,並映射到可視化。 – Nzc 2015-02-10 11:47:02

回答

1

我的建議是創建一個專用視圖模型來表示該視圖中的一個項目。這些視圖模型的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; } 
} 
+0

這實際上是我現在正在做的事情,它工作得很好。所以基本上我有一個SkillRow類,左邊和右邊的Skill對象,VM監聽Left和Right集合中的變化。虛擬機具有一系列SkillRows,這些SkillRows集合了Left和Right集合,並添加了新的SkillRows或使用現有的行將技能添加到Left或Right屬性。也許我的解決方案畢竟是好的... – 2015-02-10 11:56:51

+0

如果是這樣,國際海事組織,你應該保持目前的設計。這裏唯一的複雜是同步,在ViewModel中處理它會更好。 – igorushi 2015-02-10 14:04:08

+0

我會將此標記爲現在已被接受。我正在研究採用@Clemens建議的方法的不同版本。也許我會在按預期工作時發佈。 – 2015-02-13 06:11:55