如何在viewmodel中访问Calendar控件中的选定日期?

时间:2012-10-08 19:49:49

标签: c# xaml mvvm caliburn.micro

我正在使用Caliburn.Micro。我的日历控件的SelectionModeMultipleRange

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

<Calendar x:Name="Dates"
          SelectedDates="{Binding SelectedDates}"
          SelectionMode="MultipleRange"
          HorizontalAlignment="Left" />

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

有解决方案吗?如何从ViewModel访问Calendar控件中的选定日期,希望使用Caliburn.Micro的约定?

2 个答案:

答案 0 :(得分:4)

我遇到了同样的情况。我只是将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>

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

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

我还发现,只要在传入的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));
    }
}

希望这有帮助!

答案 1 :(得分:1)

听起来你需要创建自己的附属属性。人们对ListBox(等)上的SelectedItems属性有完全相同的问题。

以下是您可能尝试的解决方案示例:
http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html

这是我过去所做的。它允许您坚持MVVM模式,但它是相当多的额外代码。您可能需要平衡MVVM的值与开发和维护的额外成本。