DataGrid - 一种在一行中显示不相关的单元格值的简洁方法?

时间:2014-01-28 19:37:45

标签: c# wpf datagrid

我是WPF的新手,我会尽量保持这一点。

我想要实现的是显示一个表格,其中单元格值彼此无关,每个表格代表一个单独的对象。

更确切地说,我需要一个类似日历的视图,每天都有相关的任务,如下所示:

table structure

显示的天数是可变的。
重要的是,按照chrolonogically列出日期,并保留特定日期的任务顺序(非常类似于ListBoxes列表)。

那么我该如何实现呢?

DataGrid似乎只将行绑定到数据。我想到了实现一个具有可变数量的DependencyProperties的适配器列表,它们假装是行。但对于这样一个简单的表格来说,这似乎有点过于复杂。

我还研究了如何使DataGrid水平,但它还有更多的代码。

任何有帮助的帮助。干杯:)

2 个答案:

答案 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>

最后,添加ListBoxItemsControl以显示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>