如何访问视图模型中日历控件中的选定日期?

xof*_*ofz 2 c# xaml mvvm caliburn.micro

我正在使用 Caliburn.Micro。SelectionMode我的日历控件的是MultipleRange

我看到一个SelectedDate可以为其创建绑定的属性,我可以在 ViewModel 中访问该属性。我也看到了SelectedDates,但是当我尝试为此创建绑定时,例如:

<Calendar x:Name="Dates"
          SelectedDates="{Binding SelectedDates}"
          SelectionMode="MultipleRange"
          HorizontalAlignment="Left" />
Run Code Online (Sandbox Code Playgroud)

它告诉我“SelectedDates属性是只读的,不能从标记中设置。”

有解决办法吗?如何从我的 ViewModel 访问日历控件中的选定日期(希望使用 Caliburn.Micro 的约定)?

小智 5

我遇到了同样的情况。我只是将 SelectedDatesChanged 事件连接到参数设置为 SelectedDates 的公共方法。这是 XAML:

<Calendar Name="TournamentCalendar" SelectionMode="MultipleRange" Margin="5">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedDatesChanged">
            <cal:ActionMessage MethodName="AssignDates">
                <cal:Parameter Value="{Binding SelectedDates, ElementName=TournamentCalendar}"/>
             </cal:ActionMessage>
        </i:EventTrigger>
   </i:Interaction.Triggers>
</Calendar>
Run Code Online (Sandbox Code Playgroud)

在我的视图模型中,我添加了以下方法。请注意参数的类型。

public void AssignDates(SelectedDatesCollection dates)
{
    if (dates.Count > 0)
    {
        _tournamentDates.Clear();
        foreach (var date in dates)
        {                  
            _tournamentDates.Add(new DateViewModel(date));
        }
        NotifyOfPropertyChange(() => TournamentDates);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还发现,一旦调用此方法,您实际上可以通过从传入的 SelectedDatesCollection 对象中添加或删除日期来更新视图模型中选定的日期,如下所示:

public void AssignDates(SelectedDatesCollection dates)
{
    if (dates.Count > 0)
    {
        // Removes today if included then adds a date 4 days from today
        DateTime today = DateTime.Today;
        if (dates.Contains(today))
        {
           dates.Remove(today);
        }
        dates.Add(today.AddDays(4));
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!