2010-10-12 2 views
1

Я совершенно новый для 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, если я не создать новый Светофор и установить 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 

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

Спасибо,

-Frinny

ответ

2

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

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

Должно быть:

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

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

+0

Благодарим вас за ответ. Я думал, что проблема связана с моей нехваткой знаний по привязке данных ... и я не заметил тип-o. – Frinavale

Смежные вопросы