2011-02-10 4 views
2

В настоящее время я работаю над 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

ответ

2

При использовании DependencyProperty, вам нужно использовать его реализации, а не ваш INotifyPropertyChanged реализация стиля для свойства. Это означает отсутствие поля поддержки (оно обрабатывается через механизмы DP) и использование свойств измененных обратных вызовов для обработки изменений или сопоставления значений вместо того, чтобы делать это в настройщике свойств.

Я рекомендую посмотреть на Dependency Property Overview на MSDN для деталей. В частности, вам нужно посмотреть how to implement a Dependency Property, а также Callbacks and Validation.

+0

Благодарим вас за руководство. Я вернулся к документации, как вы предложили, и обнаружил кучу вещей, которые я делал неправильно. Наиболее полезной статьей была подзаголовок одной из опубликованных вами ссылок: http://msdn.microsoft.com/en-us/library/ms753358.aspx Еще раз спасибо! – Frinavale