Dieser Beitrag ist komplett eine solidere Beispiel bereitzustellen bearbeitet und vereinfacht fragenAggregatdaten von Kind in Mutter für Bindung
Ich bin auf der Suche, die Ergebnisse haben von Child Veränderungen in der Eltern berücksichtigt werden, insbesondere die Feld NumberOfChildrenWithDegrees
. Wenn Sie beide Kontrollkästchen mit den Bindungen HasUniversityDegree
und HasHighSchoolDegree
aktivieren, wird HasTwoDegrees
in den untergeordneten Ansichten aktualisiert. Was ich möchte ist die Anzahl der Kinder mit HasTwoDegrees
in der Parent VM reflektiert werden.
Ich dachte, das nur einfach sein würde, aber es stellt sich heraus, dass es nicht funktioniert -. In der übergeordneten Ansicht (die <TextBlock Text="{Binding NumberOfChildrenWithDegrees,Mode=TwoWay,UpdateSourceTrigger=Explicit}"/>
Bereich Überprüfung zwei Boxen ändert sich nichts Wie kann ich diese Nummer ändern erhalten Echtzeit geschehen ?
ich habe eine kleine Probe für Windows Phone erstellt, die direkt in eine Seite Testseite. legen Sie einfach die XAML in den Inhalt Gitter und den Code im Code-Behind (VB) genannt eingesteckt werden kann.
XAML:
<Grid x:Name="ContentPanel" Background="{StaticResource PhoneChromeBrush}" Grid.Row="1">
<ListBox x:Name="parentLB" Margin="12,12,12,12" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Margin="0,12,0,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Parent Name: "/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Number of Children with Degrees: "/>
<TextBlock Text="{Binding NumberOfChildrenWithDegrees,Mode=TwoWay,UpdateSourceTrigger=Explicit}"/>
</StackPanel>
<ListBox Margin="12,0,0,0" x:Name="group2" ItemsSource="{Binding Children,Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Child Name: "/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
<CheckBox Content="Has High School Degree:" IsChecked="{Binding HasHighSchoolDegree,Mode=TwoWay}"/>
<CheckBox Content="Has University Degree: " IsChecked="{Binding HasUniversityDegree,Mode=TwoWay}"/>
<CheckBox Content="Has Two Degrees? " IsEnabled="False" IsChecked="{Binding HasTwoDegrees}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
-Code-behind:
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Partial Public Class TestPage
Inherits PhoneApplicationPage
Public Sub New()
InitializeComponent()
parentLB.ItemsSource = Grandparent1.ParentGroups
End Sub
Public Function Grandparent1() As GrandParent
Dim ParentGroups As New List(Of Parent)
ParentGroups.Add(Parent1)
ParentGroups.Add(Parent2)
Dim gp As New GrandParent
gp.ParentGroups = ParentGroups
Return gp
End Function
Public Function Parent2() As Parent
Dim p As New Parent With {.Name = "Tom"}
Dim c1 As New Child With {.Name = "Tammy"}
Dim c2 As New Child With {.Name = "Timmy"}
Dim children As New List(Of Child)
children.Add(c1)
children.Add(c2)
p.Children = children
Return p
End Function
Public Function Parent1() As Parent
Dim p As New Parent With {.Name = "Carol"}
Dim c1 As New Child With {.Name = "Carl"}
c1.HasHighSchoolDegree = True
c1.HasUniversityDegree = True
Dim c2 As New Child With {.Name = "Karla"}
Dim children As New List(Of Child)
children.Add(c1)
children.Add(c2)
p.Children = children
Return p
End Function
End Class
Public Class GrandParent
Inherits BindableBase
Public Property ParentGroups As List(Of Parent)
End Class
Public Class Parent
Inherits BindableBase
Public Property Name As String
Private _children As List(Of Child)
Public Property Children As List(Of Child)
Get
Return Me._children
End Get
Set(value As List(Of Child))
Me.SetProperty(Me._children, value)
End Set
End Property
Private _numberOfChildrenWithDegrees As Integer
Public Property NumberOfChildrenWithDegrees As Integer
Get
Return Children.Where(Function(f) f.HasTwoDegrees).Count
End Get
Set(value As Integer)
Me.SetProperty(Me._numberOfChildrenWithDegrees, value)
End Set
End Property
End Class
Public Class Child
Inherits BindableBase
Public Property Name As String
Public ReadOnly Property HasTwoDegrees As Boolean
Get
Return HasHighSchoolDegree AndAlso HasUniversityDegree
End Get
End Property
Private _hasUniversityDegree As Boolean
Public Property HasUniversityDegree As Boolean
Get
Return Me._hasUniversityDegree
End Get
Set(value As Boolean)
Me.SetProperty(Me._hasUniversityDegree, value)
OnPropertyChanged("HasTwoDegrees")
End Set
End Property
Private _hasHighSchoolDegree As Boolean
Public Property HasHighSchoolDegree As Boolean
Get
Return Me._hasHighSchoolDegree
End Get
Set(value As Boolean)
Me.SetProperty(Me._hasHighSchoolDegree, value)
OnPropertyChanged("HasTwoDegrees")
End Set
End Property
End Class
Public MustInherit Class BindableBase
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Protected Function SetProperty(Of T)(ByRef storage As T, value As T,
Optional propertyName As String = Nothing) As Boolean
If Object.Equals(storage, value) Then Return False
storage = value
Me.OnPropertyChanged(propertyName)
Return True
End Function
Protected Sub OnPropertyChanged(Optional propertyName As String = Nothing)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
Dank Joshua, Hinzufügen eines Ereignishandlers für jedes Kind scheint ein wenig unentgeltlich, aber wenn das ist sie müssen es sein, dann denke ich, das ist sie so ist es. Dies geht jedoch nur mit Situationen um, in denen ich eine 'GrandParent'-Klasse erstelle, d. H. Jedes" Kind "von jedem" Elternteil "zu" PropertyChanged "zu abonnieren. Wie bei meinen/den meisten Daten ist das 'GrandParent' serialisiert - wie abonniere ich die Kinder bei der Deserialisierung? Auch, ist diese Art, Dinge auf die übliche Weise zu tun? Ich dachte bei MVVM, es gäbe etwas weniger "Codey". –
Dies ist die einzige Möglichkeit, die ich bisher erreichen konnte, aber es könnte bessere Wege geben. Was die Deserialisierung anbelangt, würde ich mich darauf verlassen, welcher Prozess bei der Deserialisierung verwendet wird, um eine Post-Construction-Logik auszuführen (dh - die Event-Handler anzubinden). Ich stimme nicht zu, dass dies komplex ist. – jmshapland
hmmm ... Ich denke, das wird tun müssen ... –