Пользовательский контроль WPF - PullRequest
0 голосов
/ 06 апреля 2011

Я создаю пользовательский элемент управления в WPF 4.0, который будет выглядеть примерно так, как показано ниже.Он в основном состоит из «плавательных дорожек».Каждый ItemsControl имеет элементы, которые можно перетаскивать, с визуальной визуализацией элемента, в пределах одной строки на каждом элементе, кроме заголовка строки.Существует фиксированное количество столбцов и переменное количество строк.

enter image description here

Я думал о двух разных подходах к этой проблеме:

  1. Используйте DataGrid и сильно измените его, чтобы он поддерживал это поведение.

  2. Создайте сетку с динамическим числом строк и внедрите каждый элемент в виде группы из 5 элементов управления (по одному для каждого столбца).

Соображения: Используя MVVM, все это должно быть в состоянии связать со списком.

Какой самый разумный подход в этой ситуации?

Прокомментируйте, если что-то неясно!

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Похоже, у вас есть несколько «элементов управления», которые вы должны создать, чтобы упростить управление этим большим составным элементом управления.

Большая часть сложного поведения, которое у вас есть, - это принудительное перетаскивание элементов управления элементами в данной строке (на самом деле, сложная часть - ограничение элементов управления элементами в других строках)

Итак, сначала я бы создал элемент управления ItemsControlGroup. Нечто подобное говорит радиогруппа, где каждый элемент управления является частью похожей группы. Вы можете сделать это, просто подключив свойство для имени группы. Это даст вам возможность выяснить, является ли цель допустимым местом падения для перетаскиваемого предмета.

Построение всего этого должно отличаться от построения этой схемы "плавательной дорожки", за которой вы хотите.

Если у вас есть элемент управления перетаскиванием, вы можете построить макет несколькими различными способами.

На этом этапе DataGrid может быть не слишком сложным, как указывал Зеби.

Вы также можете получить набор вложенных стековых панелей или какую-то сетку. Макет будет легкой частью.

1 голос
/ 06 апреля 2011

Если вы хотите использовать сетку данных wpf, нетрудно достичь желаемого макета, если вы используете TemplateColumn s для своих столбцов 2-5:

<dg:DataGridTemplateColumn Header="....">
    <dg:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <!-- your custom control -->
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellEditingTemplate>
    <dg:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <!-- ... -->
        </DataTemplate>
    </dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>

Источник элементов для сетки может бытьsimple List / ObservableCollection.

Однако вам все равно придется самостоятельно внедрить механизм перетаскивания.

...