2

私のWPF MVVMアプリには次のスタイルがあります。

<Style x:Key="DefaultCalendar" TargetType="Calendar">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Calendar}">
                <StackPanel HorizontalAlignment="Center" Name="PART_Root">
                    <CalendarItem Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="{TemplateBinding Control.BorderThickness}" Name="PART_CalendarItem" Style="{TemplateBinding Calendar.CalendarItemStyle}" />
                    <Button Content="Today" Command="Commands:CalendarCommands.SelectToday" CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Commands クラスを作成しました

namespace Viterra.Freight.Client.Resources.Commands
{
    public class CalendarCommands
    {
        public static RoutedCommand SelectToday = new RoutedCommand("Today", typeof(CalendarCommands));
    }
}

カレンダーが開いたときに表示されますが、ボタンは無効になっています。日付を設定するために、このルーティングされたコマンドでさらに多くのことを行う必要があると確信していますが、何をどこで行うかはわかりません。

編集: 最終的な解決策 私はまた、この Calendar スタイルを常に使用するように DatePicker を変更していたことに注意してください。

<Style x:Key="DefaultCalendar" TargetType="Calendar">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Calendar}">
                <StackPanel HorizontalAlignment="Center" Name="PART_Root">
                    <CalendarItem Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="{TemplateBinding Control.BorderThickness}" Name="PART_CalendarItem" Style="{TemplateBinding Calendar.CalendarItemStyle}" />
                    <Button Content="Today" Command="Commands:CalendarCommands.SelectToday" CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- style for default datepicker -->
<Style x:Key="DefaultDatePicker" TargetType="DatePicker">
    <Setter Property="Height" Value="23"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="CalendarStyle" Value="{StaticResource DefaultCalendar}" />
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource DateTimeValidationTemplate}" />
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

そしてCalendarCommands.cs

using System;
using System.Windows.Input;
using System.Windows.Controls;

namespace Viterra.Freight.Client.Resources.Commands
{
    public static class CalendarCommands
    {
        private static readonly SelectTodayCommand _selectTodayCommand = new SelectTodayCommand();

        public static ICommand SelectToday
        {
            get { return _selectTodayCommand; }
        }

        private sealed class SelectTodayCommand : ICommand
        {
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }

            public bool CanExecute(object parameter)
            {
                return parameter is Calendar;
            }

            public void Execute(object parameter)
            {
                var calendar = parameter as Calendar;
                if (calendar == null) 
                    return;

                var today = DateTime.Today;
                calendar.SelectedDate = today;
                calendar.DisplayDate = today;
            }
        }
    }
}
4

2 に答える 2

4

または、コード ビハインドと を使用したくない場合は、代わりにCommandBindings単純なICommand実装を使用できます。

public static class CalendarCommands
{
   private static readonly SelectTodayCommand _selectToday = new SelectTodayCommand();

   public static ICommand SelectToday
   {
      get { return _selectToday; }
   }

   private sealed class SelectTodayCommand : ICommand
   {
      public event EventHandler CanExecuteChanged
      {
         add { CommandManager.RequerySuggested += value; }
         remove { CommandManager.RequerySuggested -= value; }
      }

      public bool CanExecute(object parameter)
      {
         return parameter is Calendar;
      }

      public void Execute(object parameter)
      {
         var calendar = parameter as Calendar;
         if (calendar != null)
         {
            DateTime today = DateTime.Today;
            calendar.SelectedDate = today;
            calendar.DisplayDate = today;
         }
      }
   }
}
于 2012-11-16T17:46:18.497 に答える
2

CommandBindings を設定するのを忘れただけです :)

ここに小さな実用的な例があります:

MainWindow.xaml

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Commands="clr-namespace:WpfApplication13"
        Title="MainWindow" Height="350" Width="525">

    <Window.CommandBindings>
        <CommandBinding Command="Commands:CalendarCommands.SelectToday"
                        Executed="SelectTodayExecuted"
                        CanExecute="SelectTodayCanExecute"/>
    </Window.CommandBindings>

    <Window.Resources>
        <Style x:Key="DefaultCalendar" TargetType="Calendar">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Calendar}">
                        <StackPanel HorizontalAlignment="Center" Name="PART_Root">
                            <CalendarItem Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="{TemplateBinding Control.BorderThickness}" Name="PART_CalendarItem" Style="{TemplateBinding Calendar.CalendarItemStyle}" />
                            <Button Content="Today" Command="Commands:CalendarCommands.SelectToday" CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <Calendar Style="{StaticResource DefaultCalendar}" />
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace WpfApplication13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void SelectTodayExecuted(object target, ExecutedRoutedEventArgs e)
        {
            // Implement logic here
        }

        private void SelectTodayCanExecute(object target, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }
    }

    public class CalendarCommands
    {
        public static RoutedCommand SelectToday = new RoutedCommand("Today", typeof(CalendarCommands));
    }
}
于 2012-11-16T17:39:42.067 に答える