0

WPFとVB.netを使用して、テキストブロック内のテキストボックスを現在の日付と時刻で更新したいと思います。タイマーを使用していますが、起動していて、オブジェクトのプロパティを「Now」に設定しているようです。そして、私はiNotifyPropertyChangedを使用しています。

私が得るのは、データが入っていない空のテキストボックスだけです。手伝ってくれますか?多分私の文脈はオフですか?

XAML

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBlock DataContext="oTime"> 
        <TextBox x:Name="myTextBox" 
                 Width="200" Height="50" Foreground="Black" 
                 Text="{Binding Path=oTime.TimeUpdate}"></TextBox>
    </TextBlock>
</Grid>
</Window>

VBコード

Imports System.ComponentModel
Imports System.Windows.Threading

Class MainWindow
  Public oTime As TimeUpdate = New TimeUpdate
  Private dpTimer As DispatcherTimer

  Private Sub TextBlock_SourceUpdated(ByVal sender As System.Object, ByVal e As System.Windows.Data.DataTransferEventArgs)

  End Sub

  Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
      dpTimer = New DispatcherTimer
      dpTimer.Interval = TimeSpan.FromMilliseconds(1000)
      AddHandler dpTimer.Tick, AddressOf TickMe
      dpTimer.Start()
  End Sub

  Private Sub TickMe()
      oTime.TimeUpdate = Now.ToString
      Debug.Print(oTime.TimeUpdate)
  End Sub

End Class

Public Class TimeUpdate
Implements INotifyPropertyChanged

  Private sTime As String

  'Declare the Event
  Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

  Public Property TimeUpdate() As String
      Get
          Return sTime

      End Get
      Set(ByVal value As String)
          sTime = value
          'Call onPropertyChanged whenever the property is updated
          OnPropertyChanged("TimeUpdate")
      End Set

  End Property

  Protected Sub OnPropertyChanged(ByVal name As String)
      RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
  End Sub

End Class
4

4 に答える 4

5

欠けているものはほとんどないようです。まず、ウィンドウのDataContextが設定されていません。あなたはそれをコンストラクターで行うことができます:

Public Sub New()
    DataContext = oTime
End Sub

これにより、ビューでTimeUpdateクラスの内容を確認できます。

次に、XAMLを変更します(TimeUpdateプロパティに直接バインドします)。

<Grid> 
    <TextBox x:Name="myTextBox" 
             Width="200" Height="50" Foreground="Black" 
             Text="{Binding Path=TimeUpdate}"></TextBox>
</Grid>

更新: 別の方法は、WindowタグにDataContext行を追加することです。このようにして、MainWindowクラスがビューに表示され、パブリックプロパティにバインドできます。

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="350" Width="525">

次に、オブジェクトにアクセスするためのパブリックプロパティを作成します。

Public Property OTime() As TimeUpdate
    Get
        Return oTime
    End Get
    Set
        oTime = value
    End Set
End Property

そして、テキストボックスをそれにバインドします。

<Grid> 
    <TextBox x:Name="myTextBox" 
             Width="200" Height="50" Foreground="Black" 
             Text="{Binding Path=OTime.TimeUpdate}"></TextBox>
</Grid>
于 2012-06-15T14:54:07.937 に答える
0

データコンテキストがオフになっていると思います。私が間違っている場合は正しく私ですが、オブジェクトではなく文字列値に設定しているようです。oTimeは、XAMLでリソースとして作成したオブジェクトですか?その場合は、StaticResourceで取得する必要があります。それ以外の場合は、インスタンス化する必要があります。

例えば。

<TextBlock >
    <TextBlock.DataContext>
        <!-- This will instantiate the object-->
        <local:TimeUpdate/> 
    </TextBlock.DataContext>
     <TextBox x:Name="myTextBox" Width="200" Height="50" Foreground="Black" Text="{Binding Path=TimeUpdate}"></TextBox>
</TextBlock>

編集:MainWindowクラスでインスタンス化されたTimeUpdateオブジェクトがあることに気づきました。その場合、コードビハインドでウィンドウのDataContextをそれ自体に設定し、oTimeをプロパティにします。そうすれば、のDataContextを設定する必要はありませんTextBlock。親のDataContext(この場合は。)を使用しWindowます。XAMLは次のようになります。

<TextBlock>
     <TextBox x:Name="myTextBox" Width="200" Height="50" Foreground="Black" Text="{Binding Path=oTime.TimeUpdate}"/>
</TextBlock>
于 2012-06-15T14:25:05.613 に答える
0

これを変更してみてください:

 Text="{Binding Path=oTime.TimeUpdate}"

に:

 Text="{Binding Path=oTime.TimeUpdate, UpdateSourceTrigger="PropertyChanged"}"
于 2012-06-15T14:53:42.700 に答える
-1

これを変更してみてください

OnPropertyChanged("TimeUpdate")

これに

OnPropertyChanged("oTime")

また、ルートグリッドにDataContextを設定していることを確認してください

<Grid DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=.}">
于 2012-06-15T14:16:56.570 に答える