wpf 将DateTime属性绑定到ItemsControl中DataTemplate内的Calendar DisplayDate

xn1cxnb4  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(133)

我有一个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}" />
qrjkbowd

qrjkbowd1#

这符合您的需求吗?

<Calendar SelectedDate="{Binding Path=CurrentDate}"
          DisplayDate="{Binding Path=SelectedDate,
                                RelativeSource={RelativeSource Self}, 
                                Mode=OneWay}" />
djmepvbi

djmepvbi2#

问题似乎在于Calendar如何修改DisplayDate属性。它目前是这样做的:

public Calendar() {
    // ...
    base.SetCurrentValueInternal(DisplayDateProperty, DateTime.Today);
}

看起来即使DisplayDate在绑定建立之前被初始化,它仍然会被推回到绑定源,就好像它是在绑定建立之后设置的一样。这很可能是一个bug。
你可以使用类似的东西来解决它:

public class MyCalendar : Calendar {
    public MyCalendar() {
        this.ClearValue(DisplayDateProperty);
    }
}

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

lymnna71

lymnna713#

尝试绑定到SelectedDate而不是DisplayDate。或者,看看如果设置IsTodayHighlighted=“false”是否效果更好。

fslejnso

fslejnso4#

我确实在某个地方读到过,如果你将一个列表框绑定到一组选定的项目(比如从另一个列表框中),它只会在第二个列表框中显示第一个选定的项目。我不确定这是否与此有关,但看起来可能是。

相关问题