在窗口上绘制计划网格的最佳方法

时间:2013-07-15 17:52:00

标签: c# wpf xaml user-interface binding

我使用可观察的集合完全设置ViewModel,并且能够在我的界面中向下钻取到指定的时间表,并希望显示一周中的每一天以及每天我希望能够显示96个不同的时间段( 15分钟增量24小时)。下面是ViewModel代码以及View代码。

我的问题是使用用户控件的最佳方法是什么。我希望每天都有一个用户控件,所以每个计划我将有7个相同类型的控件,但我需要将我的数据绑定数据转换为用户控件。我是否需要创建自定义依赖项属性并传递所有96个变量?

如果我在控件内执行此操作,是否会硬编码一个包含96列和三行的网格,并将每个数据块键入相应的矩形?

我的目标是拥有一个可重新调整大小的计划控制,其中包含星期几作为文本,底部的小时数和每15分钟的颜色表示。例如,每个段可以是红色,蓝色或绿色。在使用网格和矩形之前,它会根据窗口重新调整大小。有没有更好的方法在屏幕上绘制形状?帆布?

谢谢, 韦斯利

public class ScheduleVM
{
    public ObservableCollection<Schedule> schedules { get; set; }

    private static ScheduleVM viewModel = null;

    public static ScheduleVM getInstance()
    {
        if (viewModel == null)
            viewModel = new ScheduleVM();

        return viewModel;
    }

    private ScheduleVM()
    {
        schedules = new ObservableCollection<Schedule>();

        for (byte i = 0; i < 32; i++)
            schedules.Add(new Schedule());
    }
}

public class Schedule
{
    public ObservableCollection<Day> days { get; set; }

    public Schedule()
    {
        days = new ObservableCollection<Day>();

        for (byte i = 0; i < 8; i++)
        {
            ObservableCollection<int> values = new ObservableCollection<int>();

            for (byte j = 0; j < 96; j++)
                values.Add(3);

            days.Add(new Day() { data = values });
        }
    }
}

public class Day : BaseVM
{
    private ObservableCollection<int> _data;
    public ObservableCollection<int> data
    {
        get
        {
            return _data;
        }
        set
        {
            _data = value;
            OnPropertyChanged("data");
        }
    }
}

以下是我目前的XAML

<ItemsControl Name="schedule">
        <ItemsControl.Resources>
            <converters:OnOffColorConverter x:Key="colorConverter"/>
        </ItemsControl.Resources>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <controls:Day data="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

1 个答案:

答案 0 :(得分:0)

你是在谈论这样的事情:将你的ItemsControl绑定到Schedules,然后在模板中,构建一个带有项目源“days”的自定义列表框,并使该列表框的itemtemplate你的日控件?我没有测试过,或者知道这是否是你的意思,但这是一个快速草案。

    <ItemsControl Name="schedule"
                  ItemsSource="{Binding schedules}">
        <ItemsControl.Resources>
            <converters:OnOffColorConverter x:Key="colorConverter"/>
        </ItemsControl.Resources>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ListBox ItemsSource="{Binding days}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <controls:Day data="{Binding}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>