1

Caliburn.Micro を使用しています。私のSelectionModeカレンダーコントロールのはMultipleRangeです。

SelectedDateViewModel でアクセスできるバインディングを作成できるプロパティが表示されます。も表示SelectedDatesされますが、そのためのバインディングを作成しようとすると、次のようになります。

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

SelectedDatesプロパティは読み取り専用で、マークアップから設定できません」と表示されます。

これに対する解決策はありますか?できれば Caliburn.Micro の規則を使用して、ViewModel から Calendar コントロールで選択した日付にアクセスするにはどうすればよいですか?

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 に答える