解决MaterialDesignInXamlToolkit TimePicker SelectedTimeChanged事件

时间:2018-09-05 12:40:59

标签: c# wpf material-design wpf-controls wpftoolkit

我正在使用MaterialDesignInXamlToolkit中的TimePicker。但是它没有 SelectedTimeChanged事件类似于WPF股票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);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

尝试使用SelectedTime属性而不是Text控件的TimePicker属性。同时设置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>

答案 1 :(得分:0)

您应将控件的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>

在视图中选择时间后,将设置source属性。