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>