2011-02-10 126 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