Привязка XAML к свойству зависимости - PullRequest
2 голосов
/ 11 февраля 2011

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

1 Ответ

2 голосов
/ 11 февраля 2011

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

Я рекомендую просмотреть Обзор свойств зависимостей в MSDN для получения подробной информации. В частности, вам нужно будет посмотреть , как реализовать свойство зависимости , а также обратные вызовы и проверка .

...