我目前正在使用WPF TimePicker控件。 控制继承一个TextBox,它具有显示时间跨度在以下格式的MaskedTexProvider:依赖属性上的XAML绑定
“HH:MM”
到目前为止,一切工作正常(向上和向下箭头更改小时和分钟底层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
但是,如果我尝试做一些像下面这样,我的时间属性的“设置”不会被调用:
<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
感谢您的指导。我按照你的建议回到了文档中,发现了一些我做错了的事情。最有用的文章是您发布的链接之一的子文章:http://msdn.microsoft.com/en-us/library/ms753358.aspx再次感谢! – Frinavale 2011-02-11 15:04:29