2015-02-10 2 views
2

Я пытаюсь создать элемент управления WPF, который отображает два вертикальных «плавающих» (слева и справа). Как Left, так и Right должны быть привязаны к двум отдельным ObservableCollection в ViewModel. ISkill имеет свойство Name и, возможно, свойство SynchronizedWith, которое в основном является ссылкой на другой объект ISkill (в противоположной коллекции).Синхронизировать положение элементов в элементах управления

Два плавника можно рассматривать как обычные вертикальные StackPanels, но все объекты ISkill, которые синхронизированы с другим объектом ISkill, всегда должны быть выровнены по вертикали (что означает, что в некоторых местах будет пустое пространство). ISkills, синхронизированный, также должен иметь подключенную линию между двумя различными swimlanes. Прилагаемое изображение, вероятно, даст лучший обзор того, что я пытаюсь выполнить.

Vertical Swimlanes

Ниже интерфейс ISkill.

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

Одна идея, которую я имел, чтобы связать левый и правый в двух ItemsControls и использовать сетку в качестве панели макета. Но я не уверен, каким образом макет должен определить, какой Grid.Row-индекс должен иметь каждый элемент в коллекциях.

Все предложения очень ценятся, спасибо!

+0

ИМО было бы легче также иметь 'двойной Level' свойства на интерфейсе ISkill, который служит вертикальное положение (либо непосредственно, либо преобразуются связывающим преобразователем) в Canvas, используемый в качестве ItemsPanel из в ItemsControl. – Clemens

+0

Обе стороны должны быть всегда выровнены, например. прокручивались вместе? – igorushi

+0

Я согласен с Клеменсом. «Уровень» можно рассчитать после применения всех ограничений к двум наборам. Каждое ограничение может быть также элементом данных и сопоставлено с визуализацией. – Nzc

ответ

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 есть коллекция SkillRows, которая объединяет коллекцию Left и Right и добавляет новые SkillRows или использует существующие ряды для добавления навыков в свойство Left или Right. Может быть, решение, которое у меня есть, все-таки хорошо ... –

+0

Если это так, ИМО, вы должны сохранить текущий дизайн. Единственная сложность здесь заключается в синхронизации, и лучше справиться с ней в ViewModel. – igorushi

+0

Я покажу это как принято. Я работаю над другой версией, которая использует подход, который предлагает @Clemens. Возможно, я опубликую это, когда он будет работать по назначению. –

Смежные вопросы