使用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
答案 0 :(得分: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>
答案 1 :(得分: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。它将使用父级的DataContext,在本例中为Window
。您现在的XAML如下所示:
<TextBlock>
<TextBox x:Name="myTextBox" Width="200" Height="50" Foreground="Black" Text="{Binding Path=oTime.TimeUpdate}"/>
</TextBlock>
答案 2 :(得分:0)
尝试更改此内容:
Text="{Binding Path=oTime.TimeUpdate}"
为:
Text="{Binding Path=oTime.TimeUpdate, UpdateSourceTrigger="PropertyChanged"}"
答案 3 :(得分:-1)
尝试更改此
OnPropertyChanged("TimeUpdate")
到这个
OnPropertyChanged("oTime")
另外,请确保已在根网格上设置DataContext
<Grid DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=.}">