В настоящее время я работаю над элементом управления WPF TimePicker.
Элемент управления наследует TextBox и имеет MaskedTexProvider, который отображает интервал времени в следующем формате:
"HH: MM"
Пока все работает как положено (стрелки вверх и вниз изменяют часы и минуты основного TimeSpan и т. Д.).
У меня проблемы с привязкой свойства TimeSpan моего элемента управления TimePicker к объекту TimeSpan.
Это работает, если я вручную устанавливаю свойство времени (которое предоставляет базовый объект TimeSpan), но не когда я пытаюсь установить свойство времени через XAML ...
Например, следующие работы:
Private Sub Test_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
TimeSpan.TryParse("2:30", myTimePicker.Time)
End Sub
Однако, если я попытаюсь сделать что-то вроде следующего, «Set» моего Time Property не будет вызван:
<Window x:Class="Test"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:systhreading="clr-namespace:System.Threading;assembly=mscorlib"
xmlns:myNS="clr-namespace:myNS"
Title="Login" Height="768" Width="1024">
<Window.Resources>
<myNS:TestClass x:Key="myTestingClass"></myNS:TestClass>
</Window.Resources>
<DockPanel DataContext="{Binding Source={StaticResource myTestingClass}}">
<myNS:TimePicker x:Name="myTimePicker" Time="{Binding TheTimeSpan}"></myNS:TimePicker>
</DockPanel>
</Window>
Вот моя реализация TimePicker's Time Property.
Public Class TimePicker
Inherits TextBox
Implements INotifyPropertyChanged
Public Shared TimeSpanProperty As DependencyProperty = DependencyProperty.Register("Time", GetType(TimeSpan), GetType(TimePicker))
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _timeSpan As TimeSpan
Public Property Time As TimeSpan
Get
Return _timeSpan
End Get
Set(ByVal value As TimeSpan)
_timeSpan = value
Dim str As String = _timeSpan.Hours.ToString.PadLeft(2, "0"c) + ":" + _timeSpan.Minutes.ToString.PadLeft(2, "0"c)
Me.Text = str
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Time"))
End Set
End Property
'..... the rest of the class implementation '
End Class
Что я делаю не так?
Изменить:
Оказывается, у меня была комбинация
проблем, которые мешали
обязательный от работы.
Прежде всего, я не должен был
используя личный член TimeSpan для моего
имущество. Я должен был использовать
Методы GetValue () и SetValue () для
установите вместо этого свойство DependencyProperty.
Во-вторых, я не следовал
соглашения об именах для
DependencyProperty. Должно иметь
следовало имя свойства "Time"
"Собственность" (другими словами это
должен был быть назван TimeProperty).
В-третьих, мне нужно было использовать
Тип FrameworkPropertyMetadata для
указать метод для вызова, когда
свойство изменено. Это где я
поставить логику для установки текста
элемент управления TimePicker.
Большая часть информации, которую я нашел
наиболее полезно в поиске решения
чтобы моя проблема была найдена в этом MSDN
Статья: Пользовательские зависимости
Свойства
Спасибо за вашу помощь!
-Frinny