C# 在窗口上绘制明细表网格的最佳方法

C# 在窗口上绘制明细表网格的最佳方法,c#,wpf,xaml,user-interface,binding,C#,Wpf,Xaml,User Interface,Binding,我有一个完全使用可观察集合设置的ViewModel,并且能够在我的界面中深入到指定的时间表,并且希望显示一周中的每一天,对于每一天,我希望能够显示96个不同的时间段(24小时内以15分钟为增量)。下面是ViewModel代码和视图代码 我的问题是使用用户控件的最佳方式是什么。我希望每天都有一个用户控件,因此每个计划中有7个相同类型的控件,但我需要某种方法将数据绑定数据放入用户控件中。我是否需要自定义依赖项属性并传入所有96个变量 如果我在控件中这样做一次,我是否会硬编码出一个96列三行的网格,并

我有一个完全使用可观察集合设置的ViewModel,并且能够在我的界面中深入到指定的时间表,并且希望显示一周中的每一天,对于每一天,我希望能够显示96个不同的时间段(24小时内以15分钟为增量)。下面是ViewModel代码和视图代码

我的问题是使用用户控件的最佳方式是什么。我希望每天都有一个用户控件,因此每个计划中有7个相同类型的控件,但我需要某种方法将数据绑定数据放入用户控件中。我是否需要自定义依赖项属性并传入所有96个变量

如果我在控件中这样做一次,我是否会硬编码出一个96列三行的网格,并将每个数据块键入相应的矩形中

我的目标是拥有一个可重新调整大小的日程控件,该控件将一周中的某一天作为文本,在底部显示小时数,并以颜色表示每15分钟一次。例如,每个段可以是红色、蓝色或绿色。在使用网格和矩形之前,它会根据窗口重新调整大小,这很好。有没有更好的方法在屏幕上绘制形状?帆布

谢谢, 卫斯理

公共类ScheduleVM
{
公共可观察收集计划{get;set;}
私有静态ScheduleVM viewModel=null;
公共静态ScheduleVM getInstance()
{
if(viewModel==null)
viewModel=newschedulevm();
返回视图模型;
}
私有ScheduleVM()
{
附表=新的可观测集合();
用于(字节i=0;i<32;i++)
附表。添加(新附表());
}
}
公课时间表
{
公共可观察收集天数{get;set;}
公共附表(
{
天数=新的可观察集合();
用于(字节i=0;i<8;i++)
{
ObservableCollection值=新的ObservableCollection();
用于(字节j=0;j<96;j++)
增加(3);
添加(新的日期(){data=values});
}
}
}
公共课日:BaseVM
{
私有可观测收集数据;
公共可观测收集数据
{
得到
{
返回数据;
}
设置
{
_数据=价值;
OnPropertyChanged(“数据”);
}
}
}
下面是我当前的XAML

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

您是否在谈论这样的事情:将您的ItemsControl绑定到Schedules,然后在模板中,构建一个带有项目源“days”的自定义列表框,并将该列表框的itemtemplate设置为您的day控件?我还没有测试出来,也不知道这是否是你的意思,但这里有一个快速草案

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


有人有什么建议吗?我现在也有类似的建议,我的问题不是数据模板部分,而是如何构造“Day”类。现在,在我的Day构造函数中,我只是有一堆循环将UI元素添加到网格(文本框和矩形)。它可以工作,但会导致加载时出现非常轻微的延迟,当我调整窗口大小时,我想这取决于您要查找的内容,但是您的类似乎很好,除非您希望将“数据”作为类列表,例如带有时间和任何信息的“ScheduledEvent”类。然后使用类似于outlook的模板(每行有一个时间)或wrappanel itemspanel绑定到一个列表框,以便它们可以是块。无论哪种方式,另一个列表可能也会更好,因为不是所有的东西都是可见的。如果您使用水平列表,您还可以按时间分组(例如按小时)来保存ScheduledEvent
    <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>