【问题标题】:Update UI when property is changed更改属性时更新 UI
【发布时间】:2010-10-12 20:07:38
【问题描述】:

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

我创建了一个具有 1 个属性(“状态”)和三个负责更改状态的方法的类。这个类实现了 INotifyPropertyChanged 接口,这样我就可以在状态变化时通知调用代码。

类如下所示:

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 用户控件来表示这个类。 此用户控件绑定到 StreetLight 类的一个实例。它显示路灯的状态并允许用户使用按钮更改状态:

<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>

我的问题是,即使 theLight 的状态发生更改,它也不会在绑定到 Status 属性的 Label 中更新,除非我在“StreetLight_PropertyChanged”事件中创建一个新的 StreetLight 并将 DataContext 设置为这个新实例处理“theLight”的 PropertyChagned 事件

像这样:

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

我做错了吗? 看起来我不应该创建一个新的类实例来在这个属性发生变化时显示更新的状态属性....

谢谢,

-弗林尼

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    你有一个错字("Satus" 而不是"Status"):

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

    应该是:

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

    由于这个错字,绑定看不到“状态”已更改,并且永远不会更新。如果您更正此问题,PropertyChanged 事件将正确反映 "Status" 已更改。

    【讨论】:

    • 感谢您的回复。我认为这个问题是由于我缺乏数据绑定知识……而我没有注意到 type-o。
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2016-08-07
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多