DataGrid - чистый способ отображения несвязанных значений ячеек подряд?

Я новичок в WPF и постараюсь сделать это коротким.

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

Чтобы быть более точным, мне нужно представление в виде календаря с соответствующими задачами на каждый день, например:

структура таблицы

Количество отображаемых дней является переменным.
Важно то, что дни перечислены в хронологическом порядке, а порядок задач в определенный день сохраняется (почти как список ListBoxes).

Так как мне этого добиться?

Кажется, что DataGrid привязывает только строки к данным. Я подумал о реализации списка адаптеров с переменным числом DependencyProperties, которые будут претендовать на строки. Но это кажется слишком сложным для такой простой таблицы.

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

Любая помощь приветствуется. Ура:)

2 ответа

Решение

Вы можете просто использовать ListBoxили даже просто ItemsControl на каждый день и иметь любое их количество... вам просто нужно правильно структурировать свои данные. Допустим, у вас есть Day класс с Date и коллекция под названием Tasks:

public class Day // Implement INotifyPropertyChanged correctly here
{
    public DateTime Day { get; set; }
    public ObservableCollection<string> Tasks { get; set; }
}

Теперь в вашей модели представления вам просто нужна коллекция Day экземпляры:

public ObservableCollection<Day> Days { get; set; }

Тогда вам просто нужно DataTemplate определить ваш ListBox для каждого Day пример:

<DataTemplate DataType="{x:Type DataTypes:Day}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="{Binding Date, StringFormat={}{0:MMM d}}" />
        <ListBox Grid.Row="1" ItemsSource="{Binding Tasks}" />
    </Grid>
</DataTemplate>

Наконец, добавьте ListBox, или же ItemsControl показать коллекцию Dayи установить ItemsPanel к StackPanel с этими Orientation свойство установлено в Horizontal:

<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding Days}" Name="overlayItems">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Добавьте некоторые тестовые данные и ваше отсутствие:

Days = new ObservableCollection<Day>();
Days.Add(new Day() { Date = new DateTime(2014, 5, 1), Tasks = new ObservableCollection<string>() { "Doing something today", "Doing something else today" } });
Days.Add(new Day() { Date = new DateTime(2014, 5, 2), Tasks = new ObservableCollection<string>() { "Doing nothing today" } });
Days.Add(new Day() { Date = new DateTime(2014, 5, 3), Tasks = new ObservableCollection<string>() { "Doing something today" } });

Я оставлю вам более мелкие детали.

Давайте предположим, что у вас есть объект View Model с именем AppointmentViewModel который имеет все задачи, которые планируется сделать в этот день. Затем вы можете создать класс View Model для одной строки, называемой WeekViewModel, например. Это тогда может иметь одно свойство на каждый день:

public class WeekViewModel : ViewModelBase {

    public AppointmentViewModel Sunday { get { . . . } set { . . . } }

    public AppointmentViewModel Monday { get { . . . } set { . . . } }

   // and so on for the rest of the week
}

Тогда у вас будет объект View Model для формы с DataGrid контроль в нем. Это будет иметь свойство, которое имеет тип WeekViewModel, Давайте назовем свойство коллекции Appointments,

XAML для DataGrid будет выглядеть примерно так:

<DataGrid AutoGenerateColumns="False"
          ItemsSource="{Binding Path=Appointments}"
          Name="ThisMonthsAppointmentsGrid">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=Sunday}" />
        <DataGridTextColumn Binding="{Binding Path=Monday}" />
        <!-- Other DataGridTextColumn definitions for other days of the week -->
    </DataGrid.Columns>
</DataGrid>
Другие вопросы по тегам