代码之家  ›  专栏  ›  技术社区  ›  Frinavale

更改属性时更新UI

  •  1
  • Frinavale  · 技术社区  · 14 年前

    我对WPF还很陌生,我对数据绑定的行为感到困惑。

    这堂课看起来是这样的:

    Public Class StreetLight
        Implements System.ComponentModel.INotifyPropertyChanged
        Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    
        Private _status As String
        Public Property Status As String
            Get
                Return _status
            End Get
            Set(ByVal value As String)
                _status = value
                RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Satus"))
            End Set
        End Property
        Public Sub New()
            _status = "unknown"
        End Sub
        Public Sub Red()
            Status = "Red"
        End Sub
        Public Sub Yellow()
            Status = "Yellow"
        End Sub
        Public Sub Green()
            Status = "Green"
        End Sub
    End Class
    

    我已经创建了一个WPF用户控件来表示这个类。

    <UserControl x:Class="StreetLightUC"
                 x:Name="StreetLightUC"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:twpf="clr-namespace:TryingWPF"
                 mc:Ignorable="d" 
                 d:DesignHeight="30" d:DesignWidth="360">
        <UserControl.Resources>
            <twpf:StreetLight x:Key="theLight" PropertyChanged="theLight_PropertyChanged" />
        </UserControl.Resources>
        <StackPanel x:Name="StreetLightContent" Orientation="Horizontal">
            <Label Width="100" HorizontalAlignment="Left">Street Light _Status</Label>
            <Label x:Name="streetLightValue" Width="120" HorizontalAlignment="Right" Content="{Binding Path=Status, Mode=OneWay}"></Label>
            <Button x:Name="Red" Click="TurnRed" Width="60">Turn Red</Button>
            <Button x:Name="Green" Click="TurnGreen" Width="60">Turn Green</Button>
        </StackPanel>
    </UserControl>
    

    我的问题是,即使更改了灯的状态,它也不会在绑定到status属性的标签中更新,除非我在处理“灯”的PropertyChanged事件的“StreetLight\PropertyChanged”事件中创建新的路灯并将DataContext设置为此新实例

    就像这样:

    Public Class StreetLightUC
        Public Sub New()
            InitializeComponent()
        End Sub
        Private Sub TurnRed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            Dim light As StreetLight= CType(FindResource("theLight"), StreetLight)
            light.Red()
        End Sub
    
        Private Sub TurnGreen(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            Dim light As StreetLight = CType(FindResource("theLight"), StreetLight)
            light.Unlock()
        End Sub
    
        Private Sub theLight_PropertyChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs)
            Dim light As StreetLight = CType(sender, StreetLight )
            Dim newLight As New StreetLight
            newLight.Status = light.Status
            StreetLightContent.DataContext = newLight
        End Sub
    End Class
    

    我做错什么了吗? 当这个属性改变时,我似乎不需要创建一个新的类实例来显示更新的状态属性。。。。

    -弗里尼

    1 回复  |  直到 14 年前
        1
  •  2
  •   Reed Copsey    14 年前

    你的拼写错误( "Satus" 而不是 "Status" ):

    RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Satus"))
    

    应该是:

    RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Status"))
    

    PropertyChanged 事件将正确反映 已经改变了。