two - XAML Enlace en Propiedad de Dependencia
wpf converter binding (1)
Actualmente estoy trabajando en un WPF TimePicker Control. El control hereda un TextBox y tiene un MaskedTexProvider que muestra un TimeSpan en el siguiente formato:
"HH: MM"
Hasta ahora todo está funcionando como se esperaba (las flechas arriba y abajo cambian las horas y los minutos del TimeSpan subyacente, etc.).
Estoy teniendo problemas con respecto a vincular la propiedad TimeSpan de mi control TimePicker a un objeto TimeSpan.
Funciona si configuro manualmente la propiedad de tiempo (que expone el objeto TimeSpan subyacente), pero no cuando intento establecer la propiedad de tiempo a través de XAML ...
Por ejemplo, los siguientes trabajos:
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
Sin embargo, si trato de hacer algo como lo siguiente, el "Conjunto" de mi propiedad de tiempo no se llama:
<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>
Aquí está la implementación de Time Protection de 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
¿Qué estoy haciendo mal?
Editar:
Resultó que tenía una combinación de problemas que impedía que el enlace funcionara.
Antes que nada, no debería haber estado usando un miembro privado de TimeSpan para mi propiedad. Debería haber estado usando los métodos GetValue () y SetValue () para establecer DependencyProperty en su lugar.
En segundo lugar, no había seguido las convenciones de nomenclatura para DependencyProperty. Debería haber sido el nombre de la propiedad "Tiempo" seguido de la "Propiedad" (en otras palabras, debería haber sido nombrado PropiedadEmporada).
En tercer lugar, necesitaba usar un tipo FrameworkPropertyMetadata para especificar un método para llamar cuando se cambia la propiedad. Aquí es donde pongo la lógica para configurar el texto del control TimePicker.
La mayoría de la información que encontré más útil para encontrar la solución a mi problema se encontró en este artículo de MSDN: Propiedades de dependencia personalizadas
¡Gracias por tu ayuda!
-Frinny
Cuando usa DependencyProperty, necesita usar su implementación en lugar de su implementación de estilo INotifyPropertyChanged para las propiedades. Esto significa que no hay campo de respaldo (se maneja a través de los mecanismos de DP), y el uso de propiedades cambió las devoluciones de llamadas para el manejo de cambios o la coerción de valores en lugar de hacerlo en el establecimiento de propiedades.
Recomiendo consultar la Descripción general de la propiedad de dependencias en MSDN para obtener más información. En particular, deberá ver cómo implementar una Propiedad de dependencia , así como Devolución de llamada y Validación .