WPF无法从变量更新文本框

时间:2012-06-15 14:12:47

标签: wpf vb.net binding inotifypropertychanged

使用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 个答案:

答案 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=.}">