我有一个WPF日历绑定的问题。我想将月份列表绑定到一个ItemsControl,该ItemsControl显示每个月的Calendar控件。但是每个呈现的Calendar都显示DateTime.Now
,而不是绑定的DateTimes。有人知道为什么会这样吗?
这是我到目前为止所拥有的:
主窗口.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>
集合分配给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;
}
CalendarMonth视图模型:
public class CalendarMonth
{
private DateTime _currentDate;
public DateTime CurrentDate
{
get { return _currentDate; }
set { _currentDate = value; }
}
}
以及要绑定到ItemsControl的Collection:
public class CalendarList : ObservableCollection<CalendarMonth>
{
}
现在,结果是:
为什么会这样?
编辑-一个可能的修复方法是将绑定模式更改为OneWay:
<Calendar DisplayDate="{Binding CurrentDate, Mode=OneWay}" />
4条答案
按热度按时间qrjkbowd1#
这符合您的需求吗?
djmepvbi2#
问题似乎在于Calendar如何修改DisplayDate属性。它目前是这样做的:
看起来即使DisplayDate在绑定建立之前被初始化,它仍然会被推回到绑定源,就好像它是在绑定建立之后设置的一样。这很可能是一个bug。
你可以使用类似的东西来解决它:
或者你可以在以后建立绑定(即,当加载日历时)使用事件处理程序或附加行为。
lymnna713#
尝试绑定到SelectedDate而不是DisplayDate。或者,看看如果设置IsTodayHighlighted=“false”是否效果更好。
fslejnso4#
我确实在某个地方读到过,如果你将一个列表框绑定到一组选定的项目(比如从另一个列表框中),它只会在第二个列表框中显示第一个选定的项目。我不确定这是否与此有关,但看起来可能是。