我想创建一个每周日历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执行此操作,还是必须手动迭代事件并手动为每个事件创建按钮?哪种方法最好?
答案 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;
...
}
直接处理上述问题。