2011-02-10 17 views
2

現在、WPF TimePickerコントロールで作業しています。 コントロールはテキストボックスを継承し、次の形式でのTimeSpanを表示MaskedTexProviderがありますXAML依存関係プロパティへのバインド

「HH:MM」

予想通りこれまでのところ、すべてが働いている(上下矢印時間と分を変更基礎となるTimeSpanなどの)

TimePanerコントロールのTimeSpanプロパティをTimeSpanオブジェクトにバインドする際に問題があります。

例えば 私はXAMLを通じて時間プロパティを設定しようとすると、私は手動ではなく、(基本的なTimeSpanオブジェクトを公開する)時間プロパティを設定した場合、それが動作

...

、次のような作品:

ここで

<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のTimeプロパティです:私は、次のような何かをしようとした場合しかし、私の時間プロパティのは呼び出されません「セット」

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 

実装。

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を設定する必要がありました。

第2に、 DependencyPropertyの名前付け規則に従っていませんでした。 "Property"(つまり の名前はTimePropertyにする必要があります)によって、 が "Time"プロパティ名に続いて になるはずです。

第3に、 FrameworkPropertyMetadataタイプを に設定すると、 プロパティが変更されたときに呼び出すメソッドを指定する必要がありました。これは、 のテキストを設定するためのロジックを、 のTimePickerコントロールに配置した場所です。あなたの助けのためのCustom Dependency Properties

ありがとう:

私は私の問題への解決策を見つけること に が最も役に立った情報のほとんどは、このMSDN 条で見つかりました!-Frinny

答えて

2

あなたがたDependencyPropertyを使用

は、あなたはそれが実装代わりの性質のために、あなたのINotifyPropertyChangedのスタイルの実装の使用する必要があります。これは、(DPメカニズムを介して処理される)バッキングフィールドを持たず、プロパティセッターで行うのではなく、変更処理または値コーディングのためにプロパティ変更コールバックを使用することを意味します。

詳細については、MSDNのDependency Property Overviewをご覧ください。特に、how to implement a Dependency PropertyCallbacks and Validationを見る必要があります。

+0

ご利用いただきありがとうございます。あなたが示唆したように私はドキュメンテーションに戻り、私が間違っていたことの束を発見しました。最も参考になった記事は、あなたが投稿したリンクのサブ記事でした:http://msdn.microsoft.com/en-us/library/ms753358.aspxもう一度ありがとう! – Frinavale

関連する問題