0

使用 WPF 和 VB.net,我想用当前日期和时间更新文本块中的文本框。我使用了一个计时器,它似乎正在触发,并将对象属性设置为“现在”。我正在使用 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 对象。在这种情况下,我会在后面的代码中将 Window 的 DataContext 设置为自身,并使 oTime 成为一个属性。这样您就不必为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 回答