我正在使用Caliburn.Micro。我的日历控件的SelectionMode
为MultipleRange
。
我看到一个SelectedDate
属性,我可以创建一个绑定,我可以在我的ViewModel中访问它。我也看到SelectedDates
,但是当我尝试为此创建绑定时,例如:
<Calendar x:Name="Dates"
SelectedDates="{Binding SelectedDates}"
SelectionMode="MultipleRange"
HorizontalAlignment="Left" />
它告诉我“SelectedDates
属性是只读的,不能通过标记设置。”
有解决方案吗?如何从ViewModel访问Calendar控件中的选定日期,希望使用Caliburn.Micro的约定?
答案 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的值与开发和维护的额外成本。