1

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

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

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

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

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

4

2 回答 2

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));
    }
}

希望这可以帮助!

于 2012-10-29T21:04:31.383 回答
1

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

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

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

于 2012-10-08T19:51:44.287 回答