2012-10-08 24 views
0

我正在使用Caliburn.Micro。我的日曆控件的SelectionModeMultipleRange如何訪問我的viewmodel中日曆控件中的選定日期?

我看到一個SelectedDate屬性,我可以創建一個綁定,我可以在我的ViewModel中訪問。我也看到SelectedDates,但是當我試圖創建一個結合,如:

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

它告訴我,「SelectedDates屬性是隻讀的並且不能從標記集」。

有沒有解決方案呢?如何從我的ViewModel訪問日曆控件中的選定日期,希望使用Caliburn.Micro的約定?

+0

如果您添加C#或VB.NET標記(以適合您的項目爲準),您可能會獲得更多視圖。 – JDB

回答

1

聽起來像你將需要創建自己的附加屬性。人們對ListBox(等)上的SelectedItems屬性有完全相同的問題。

這裏有一個解決方案的例子,你可以嘗試:
http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html

這是我在過去所做的那樣。它允許你保持對MVVM模式的忠實,但它是相當多的額外的代碼。您可能需要平衡MVVM的價值與開發和維護的額外成本。

3

我遇到了同樣的情況。我只是將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)); 
    } 
} 

希望這有助於!

相關問題