Ole*_*rat 11 wpf datetime calendar itemscontrol
我有WPF绑定的问题.我想将Months列表绑定到ItemsControl,每个月显示一个Calendar Control.但每个呈现的日历显示DateTime.Now,而不是绑定的DateTimes.有谁知道为什么会这样?
这是我到目前为止:
MainWindow.xaml
<Window x:Class="CalendarListTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ItemsControl x:Name="calendarList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Calendar DisplayDate="{Binding CurrentDate}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)
**将集合分配给ItemsSource的地方**
private void Window_Loaded( object sender, RoutedEventArgs e )
{
CalendarList list = new CalendarList( );
list.Add( new CalendarMonth( ) { CurrentDate = DateTime.Parse( "1.1.1979" ) } );
list.Add( new CalendarMonth( ) { CurrentDate = DateTime.Parse( "1.2.1979" ) } );
list.Add( new CalendarMonth( ) { CurrentDate = DateTime.Parse( "1.3.1979" ) } );
calendarList.ItemsSource = list;
}
Run Code Online (Sandbox Code Playgroud)
CalendarMonth ViewModel:
public class CalendarMonth
{
private DateTime _currentDate;
public DateTime CurrentDate
{
get { return _currentDate; }
set { _currentDate = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
和Collection绑定到ItemsControl:
public class CalendarList : ObservableCollection<CalendarMonth>
{
}
Run Code Online (Sandbox Code Playgroud)
现在,结果是:

为什么会这样?
编辑:提供<Calendar DisplayDate="{Binding CurrentDate, Mode=OneWay}" />绑定时的工作原理.
Mar*_*ter 16
这符合您的需求吗?
<Calendar SelectedDate="{Binding Path=CurrentDate}"
DisplayDate="{Binding Path=SelectedDate,
RelativeSource={RelativeSource Self},
Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)
问题似乎与日历如何初始化DisplayDate属性有关。当前它是这样的:
public Calendar() {
// ...
base.SetCurrentValueInternal(DisplayDateProperty, DateTime.Today);
}
Run Code Online (Sandbox Code Playgroud)
看起来,即使DisplayDate在绑定建立之前就已初始化,它仍将被推回绑定源,就像在设置之后一样。这很可能是一个错误。
您可以使用以下方法解决此问题:
public class MyCalendar : Calendar {
public MyCalendar() {
this.ClearValue(DisplayDateProperty);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以稍后使用事件处理程序或附加行为建立绑定(即,在加载日历时)。
| 归档时间: |
|
| 查看次数: |
5069 次 |
| 最近记录: |