Обновление пользовательского интерфейса при изменении свойства - PullRequest
1 голос
/ 13 октября 2010

Я довольно новичок в 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. Он отображает состояние 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, если я не создаю новый StreetLight и не устанавливаю для DataContext этот новый экземпляр в событии "StreetLight_PropertyChanged" который обрабатывает событие PropertyChagned для "theLight"

Вроде так:

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

Я что-то не так делаю? Не похоже, что мне нужно создавать новый экземпляр класса для отображения обновленного свойства status, когда это свойство изменяется ....

Спасибо

-Frinny

1 Ответ

2 голосов
/ 13 октября 2010

У вас есть опечатка ("Satus" вместо "Status"):

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

Должно быть:

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

При этой опечатке привязка не видит, что«Статус» изменился и никогда не обновляется.Если вы исправите это, событие PropertyChanged будет правильно отражать, что "Status" изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...