WPF:将DateTime类型的viewmodel属性绑定到ItemsControl中的Calendar

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)

  • +1很好的答案。我想知道为什么日历不会像这样初始化自己......我撕扯着我的头发试图理解为什么以下内容不能简单地工作:`&lt;Calendar SelectedDate =“{Binding What}”DisplayDate =“{Binding What}”/ &gt;` (2认同)

Cod*_*ked 5

问题似乎与日历如何初始化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)

或者,您可以稍后使用事件处理程序或附加行为建立绑定(即,在加载日历时)。