解决 MaterialDesignInXamlToolkit TimePicker SelectedTimeChanged 事件

Work around for MaterialDesignInXamlToolkit TimePicker SelectedTimeChanged event

我正在使用来自 MaterialDesignInXamlToolkit 的 TimePicker。但它没有 SelectedTimeChanged 事件类似于 WPF stock DatePicker 的 SelectedDateChanged 事件。

目前我正在绑定 TimePicker 的文本以获得类似的东西。但问题是在用户完成选择时间之前,文本会更新几次。

是否有人熟悉该工具包并且知道任何解决方法?

XAML :

<UserControl x:Class="DateTimePickerTest.CustomDateTimePicker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DateTimePickerTest"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d" 
             d:DesignHeight="500" d:DesignWidth="600">
    <Grid>

        <materialDesign:TimePicker Name="timePicker" Width="100" Height="30"
                                       Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                        AncestorType={x:Type local:CustomDateTimePicker}},
                                        Path=Time}">
        </materialDesign:TimePicker>

    </Grid>
</UserControl>

C#:

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

namespace DateTimePickerTest
{
    public partial class CustomDateTimePicker : UserControl
    {
        private string _Time;
        public string Time
        {
            get { return _Time; }
            set
            {
                _Time = value;
                TimePicked();
            }
        }

        public CustomDateTimePicker()
        {
            InitializeComponent();
        }

        public void TimePicked()
        {
            if (timePicker.SelectedTime != null)
            {
                _Time = timePicker.SelectedTime.Value.ToString("hh:mm tt");
                MessageBox.Show(_Time);
            }
        }
    }
}

您应该将控件的 SelectedTime 属性 绑定到 DateTime? 源 属性:

public partial class CustomDateTimePicker : UserControl
{
    private DateTime? _Time;
    public DateTime? Time
    {
        get { return _Time; }
        set
        {
            _Time = value;
            TimePicked();
        }
    }

    public CustomDateTimePicker()
    {
        InitializeComponent();
    }

    public void TimePicked()
    {
        if (_Time.HasValue)
        {
            MessageBox.Show(_Time.Value.ToString("hh:mm tt"));
        }
    }
}

XAML:

<materialDesign:TimePicker Name="timePicker" Width="100" Height="30"
                           SelectedTime="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:CustomDateTimePicker}}, Path=Time}">
</materialDesign:TimePicker>

当您在视图中 select 一次时,将设置源 属性。

尝试使用 SelectedTime 属性 而不是 TimePicker 控件的 Text 属性。同时设置UpdateSourceTrigger=LostFocus。喜欢,

<mDesign:TimePicker Name="timePicker" Width="100" Height="30"
                    SelectedTime="{Binding Time, RelativeSource={RelativeSource Mode=FindAncestor,
                                                 AncestorType={x:Type local:CustomDateTimePicker}, 
                                   UpdateSourceTrigger=LostFocus}">
</mDesign:TimePicker>