我是WPF的新手,我会尽量保持这一点。
我想要实现的是显示一个表格,其中单元格值彼此无关,每个表格代表一个单独的对象。
更确切地说,我需要一个类似日历的视图,每天都有相关的任务,如下所示:
显示的天数是可变的。
重要的是,按照chrolonogically列出日期,并保留特定日期的任务顺序(非常类似于ListBoxes列表)。
那么我该如何实现呢?
DataGrid似乎只将行绑定到数据。我想到了实现一个具有可变数量的DependencyProperties的适配器列表,它们假装是行。但对于这样一个简单的表格来说,这似乎有点过于复杂。
我还研究了如何使DataGrid水平,但它还有更多的代码。
任何有帮助的帮助。干杯:)
答案 0 :(得分:1)
你可以每天只使用一个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" } });
我会留下更精细的细节。
答案 1 :(得分:0)
假设您有一个名为AppointmentViewModel
的视图模型对象,该对象具有计划在当天完成的所有任务。然后,您可以为一行称为WeekViewModel
创建一个View Model类。那么每天可以有一个属性:
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
。
DataGrid
的XAML看起来像这样:
<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>