我目前正在研究WPF TimePicker控件。 控件继承TextBox,它有一个MaskedTexProvider,它以下列格式显示TimeSpan:
“HH:MM”
到目前为止,所有内容都按预期工作(上下箭头会更改基础TimeSpan的小时和分钟等)。
我遇到了将TimePicker控件的TimeSpan属性绑定到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
但是,如果我尝试执行以下操作,我的Time Property的“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
我做错了什么?
修改
事实证明我有一个组合 的问题阻止了 工作中的约束力。
首先,我不应该 使用私人TimeSpan会员为我的 属性。我应该一直在使用 GetValue()和SetValue()方法 改为设置DependencyProperty。
其次,我没有跟着 的命名约定 的DependencyProperty。应该有 一直是“时间”属性名称 由“财产”(换言之) 应该被命名为TimeProperty)。
第三,我需要使用一个 FrameworkPropertyMetadata类型为 指定一个方法来调用 财产改变了。这是我的地方 把逻辑设置为 TimePicker控件。
我找到的大部分信息 最有助于找到解决方案 我的问题是在这个MSDN中找到的 文章:Custom Dependency Properties
感谢您的帮助!
-Frinny
答案 0 :(得分:2)
当您使用DependencyProperty时,您需要使用它的实现而不是INotifyPropertyChanged样式的属性实现。这意味着没有后备字段(它通过DP机制处理),并使用属性更改回调来进行更改处理或值更改,而不是在属性设置器中执行。
我建议您查看MSDN上的Dependency Property Overview以获取详细信息。特别是,您需要查看how to implement a Dependency Property以及Callbacks and Validation。