2011-02-10 141 views
2

我目前正在使用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

回答

2

当你使用一个DependencyProperty,您需要使用它的实现,而不是对性能的INotifyPropertyChanged的风格实现。这意味着没有后台字段(它通过DP机制处理),并使用属性更改回调进行更改处理或值转换,而不是在属性设置器中执行。

我建议查看MSDN上的Dependency Property Overview以了解详细信息。特别是,您需要查看how to implement a Dependency Property以及Callbacks and Validation

+0

感谢您的指导。我按照你的建议回到了文档中,发现了一些我做错了的事情。最有用的文章是您发布的链接之一的子文章:http://msdn.microsoft.com/en-us/library/ms753358.aspx再次感谢! – Frinavale 2011-02-11 15:04:29