Я совершенно новый для 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
Благодарим вас за ответ. Я думал, что проблема связана с моей нехваткой знаний по привязке данных ... и я не заметил тип-o. – Frinavale