依赖属性上的XAML绑定

时间:2011-02-10 21:25:30

标签: xaml wpf-controls binding

我目前正在研究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

1 个答案:

答案 0 :(得分:2)

当您使用DependencyProperty时,您需要使用它的实现而不是INotifyPropertyChanged样式的属性实现。这意味着没有后备字段(它通过DP机制处理),并使用属性更改回调来进行更改处理或值更改,而不是在属性设置器中执行。

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