Обходной путь для события MaterialDesignInXamlToolkit TimePicker SelectedTimeChanged - PullRequest
0 голосов
/ 05 сентября 2018

Я использую TimePicker из MaterialDesignInXamlToolkit . Но это не имеет SelectedTimeChanged событие, похожее на событие WPF * DatePicker's SelectedDateChanged.

В настоящее время я связываю текст TimePicker's, чтобы получить нечто подобное. Но проблема в том, что текст обновляется пару раз, прежде чем пользователь заканчивает выбирать время.

Кто-нибудь знаком с инструментарием и знает какие-нибудь обходные пути?

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 голосов
/ 06 сентября 2018

Попробуйте использовать свойство 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>
0 голосов
/ 05 сентября 2018

Вы должны привязать свойство 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>

Тогда свойство источника будет установлено при выборе времени в представлении.

...