WPF周日历DataTemplate

时间:2018-02-07 14:11:55

标签: c# wpf data-binding datatemplate

我想创建一个每周日历UserControl。最后它应该看起来像this

我有一个带事件的ObservableCollection。每个事件都有一个开始DateTime和一个结束DateTime。我还有一个网格,我想放置每个事件:

   <Grid x:Name="week_Grid" Margin="38,0,0,0" ShowGridLines="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
</Grid>

每列代表一周工作日。每个事件的按钮必须具有正确的长度和偏移量,根据开始/结束日期时间也在正确的列中。

目前我所要做的就是创建一个ListBox:

<ListBox Width="400" Margin="10" ItemsSource="{Binding Path=Events}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Id}" />
                        <TextBlock Text="{Binding Path=Start}" />
                        <TextBlock Text="{Binding Path=End}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

但是如何在网格中自由定位元素,根据星期几分配正确的GridColumn并在一天中的正确时间正确定位? Grid不允许设置ItemSource。

我还必须管理在不同日期开始的事件。这些事件需要多个按钮。是否可以使用DataTemplates执行此操作,还是必须手动迭代事件并手动为每个事件创建按钮?哪种方法最好?

1 个答案:

答案 0 :(得分:0)

我决定只用DataTemplate就不可能做到这一点。我无法实现所有必要的逻辑(例如,为跨越多天的事件添加多个元素)。 我在视图中添加了一个事件处理程序来手动执行:

private void EventsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
       switch (e.Action)
       {
           case NotifyCollectionChangedAction.Add:
              break;
           case NotifyCollectionChangedAction.Replace:
              break;
           case NotifyCollectionChangedAction.Remove:
              break;
           case NotifyCollectionChangedAction.Reset:
              break;
           case NotifyCollectionChangedAction.Move:
              break;
       }
}

简单地将其传递给ViewModel:

public EventViewModel(System.Collections.Specialized.NotifyCollectionChangedEventHandler changed)
{
    ...
    Events = new ObservableCollection<Event>();
    Events.CollectionChanged += changed;
    ...
}

直接处理上述问题。