2017-11-26 1 views
0

In meinem ViewModel habe ich eine Liste PlanTable - List PlanTable. DayPlan enthält String Day und List ExercisesWithReps. ExercisesWithReps enthält der String-Name und Liste RepsSo wählen Sie den äußeren Listeneintrag aus, wenn der innere Listeneintrag ausgewählt ist?

Ich möchte in der Lage sein, all diese mit List-Box angezeigt werden (was ich bereits getan haben). screenshot

Wenn ein Benutzer klickt auf einen ExerciseName oder eine der Ich möchte in der Lage sein, nicht nur einen dieser 2, sondern auch einen Tag festzuhalten (zB wenn ein Benutzer unter Test auf 12 klickt, möchte ich auch Montag bekommen. Wenn der Benutzer auf eine beliebige Übung klickt) Dienstag möchte ich auch Dienstag auswählen). Aber ich kann nicht verstehen, wie es zu tun ..

im Moment hier ist mein Code: VIEW:

<ListBox Name="lbParent" Grid.Row="1" Grid.ColumnSpan="3" ItemsSource="{Binding PlanTable}" SelectedItem="{Binding SelectedListItem, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel HorizontalAlignment="Center"/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
        <StackPanel> 
         <TextBlock Text="{Binding Day}" HorizontalAlignment="Center" Foreground="Black" Grid.Row="0" Margin="10"/> 
         <ListBox ItemsSource="{Binding ExercisesWithReps}" SelectedItem="{Binding SelectedExerciseName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"> 
           <ListBox.ItemsPanel> 
           <ItemsPanelTemplate> 
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"/> 
           </ItemsPanelTemplate> 
          </ListBox.ItemsPanel> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 

            <StackPanel HorizontalAlignment="Center"> 
             <TextBlock Text="{Binding Path=Name}" HorizontalAlignment="Center"/> 
             <ListBox ItemsSource="{Binding Reps}" BorderBrush="Transparent" SelectedItem="{Binding SelectedReps, UpdateSourceTrigger=PropertyChanged}"> 
              <ListBox.ItemsPanel> 
               <ItemsPanelTemplate> 
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"/> 
               </ItemsPanelTemplate> 
              </ListBox.ItemsPanel> 
              <ListBox.ItemTemplate> 
               <DataTemplate> 
                <TextBlock Text="{Binding }" HorizontalAlignment="Center"/> 
               </DataTemplate> 
              </ListBox.ItemTemplate> 
             </ListBox> 
            </StackPanel> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
        </StackPanel> 



       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Hier ist das Ansichtsmodell und DayPlan:

 private List<DayPlan> planTable; 
    public List<DayPlan> PlanTable 
    { 
     get { return planTable; } 
     set 
     { 
      planTable = value; 
      RaisePropertyChanged(); 
     } 
    } 
public class DayPlan 
{ 
    public string Day { get; set; } 
    public List<Exercise> ExercisesWithReps { get; set; } 
    private Exercise selectedExerciseName; 
    public Exercise SelectedExerciseName 
    { 
     get { return selectedExerciseName; } 
     set 
     { 
      selectedExerciseName = value; 
      if (value != null) 
      { 
       TempExercise.Name = value.Name; 
      } 
     } 
    } 
} 
    public class Exercise 
{ 
    public string Name { get; set; } 
    public List<int> Reps { get; set; } 
    private int selectedReps; 
    public int SelectedReps 
    { 
     get { return selectedReps; } 
     set 
     { 
      selectedReps = value; 
      TempExercise.Reps = value; 
     } 
    } 
} 

Bei der Moment kann ich die Auswahl des Benutzers nur erfassen, wenn er alle 3 Elemente (Tag, ExerciseName und Reps) auswählt. Auch die Art, wie ich Name und Reps bin Fang sehr unangenehm ... ich es nicht in Ansichtsmodell erfasst werden machen könnte ...

+0

Ich denke, es wäre viel einfacher mit TreeView – sTrenat

Antwort

0

Stellen Sie die SelectedListItem Eigenschaft, wenn die SelectedExerciseName Eigenschaft eines DayPlan gesetzt:

planTable = new List<DayPlan>() { ... }; 
foreach(var dayPlan in planTable) 
{ 
    dayPlan.PropertyChanged += (ss, ee) => 
    { 
     if(e.PropertyName == "SelectedExerciseName") 
     { 
      SelectedListItem = dayPlan; 
      RaisePropertyChanged("SelectedListItem"); 
     } 
    }; 
} 

Dies erfordert die DayPlan Klasse die INotifyPropertyChanged Schnittstelle und erhöhen die PropertyChanged Ereignis zu implementieren, wenn die SelectedExerciseName Eigenschaft auf einen neuen Wert gesetzt. Sie müssen auch Mode=OneWayToSource aus den Bindungen in XAML entfernen.

+0

wo geht die Foreach-Schleife? – Alex

+0

@Alex: Im Konstruktor des Ansichtsmodells oder wo auch immer Sie die PlanTable-Eigenschaft initialisieren. – mm8

+0

Liste enthält keine Entschlüsselung für PropertyChanged ... das habe ich bekommen – Alex

Verwandte Themen