В настоящее время я работаю над WPF TimePicker Control. управления наследует TextBox и имеет MaskedTexProvider, который отображает TimeSpan в следующем формате:XAML привязка к зависимому свойству
«HH: MM»
До сих пор все работает, как ожидалось (стрелки вверх и вниз изменяются часы и минуты от базового TimeSpan и т. д.).
У меня возникли проблемы с привязкой свойства TimeSpan моего TimePicker Control к объекту 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» не дозвонились:
<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 в реализация.
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
Что я делаю неправильно?
Edit:
Оказывается, что у меня было сочетание проблем, которые были предотвращающих связывания от работы.
Прежде всего, я не должен был быть с помощью частного члена TimeSpan для моего . Я должен был использовать методы GetValue() и SetValue() для вместо этого установить DependencyProperty.
Во-вторых, я не соблюдал соглашения об именах для функции DependencyProperty . Оно должно иметь имя свойства «Время», которое следует за «Имуществом» (другими словами, оно должно было быть названо TimeProperty).
В-третьих, мне нужно использовать тип FrameworkPropertyMetadata для указать метод для вызова, когда свойство изменяется. Здесь I помещает логику для установки текста элемента управления TimePicker.
Большая часть информации, которую я нашел наиболее полезным в поиске решения моей проблемы было найдено в этом MSDN статьи: Custom Dependency Properties
Спасибо за вашу помощь!
-Frinny
Благодарим вас за руководство. Я вернулся к документации, как вы предложили, и обнаружил кучу вещей, которые я делал неправильно. Наиболее полезной статьей была подзаголовок одной из опубликованных вами ссылок: http://msdn.microsoft.com/en-us/library/ms753358.aspx Еще раз спасибо! – Frinavale