2016-04-27 2 views
0

Ich habe ein Fenster eingebaut, die eine XAML hat, die wie folgt aussieht:WPF Datenbindung der Aktualisierung nicht

<Window.Resources> 
    <DataTemplate x:Key="DataTemplate_Level2"> 
     <Label Content="{Binding }" Width="70" Height="70" HorizontalContentAlignment="Center" x:Name="Background"> 
     </Label> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding}" Value="1"> 
       <Setter TargetName="Background" Property="Background" Value="Black"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding}" Value="5"> 
       <Setter TargetName="Background" Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding }" Value="9"> 
       <Setter TargetName="Background" Property="Background" Value="Green"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=lst, Mode=OneWay}" Value="7"> 
       <Setter TargetName="Background" Property="Background" Value="blue"/> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    <DataTemplate x:Key="DataTemplate_Level1"> 
     <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </DataTemplate> 
</Window.Resources> 

<DockPanel> 
    <Grid > 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30" /> 
      <RowDefinition Height="1*" /> 
      <RowDefinition Height="30" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20" /> 
      <ColumnDefinition Width="1*" /> 
      <ColumnDefinition Width="20" /> 
     </Grid.ColumnDefinitions> 
     <Grid KeyDown="OnKeyDownHandler" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <ItemsControl Grid.Row="1" Grid.Column="1" x:Name="lst" ItemTemplate="{DynamicResource DataTemplate_Level1}"/> 
     </Grid> 

     <WrapPanel Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <Button Content="Start" Click="Start_Click" FontSize="15" MinHeight="30" MinWidth="90"/> 
      <Button Content="Suggestion" Click="Suggestion_Click" FontSize="15" MinHeight="30" MinWidth="90"/> 
      <Button Content="Exit" Click="Back_Click" FontSize="15" MinHeight="30" MinWidth="90"/> 
     </WrapPanel> 
    </Grid> 
</DockPanel> 

nun alle Informationen in der „lst“ aus einer 2D-Liste Ich erhalte das ist in meinem Modell gespeichert. Während der Laufzeit, wenn ich einen Wert in der Liste ändere, erscheinen die Änderungen überhaupt nicht im Grid.

Wie kann ich sicherstellen, dass dies passiert?

Dies ist die Bindelinie in CS-

viewModel.Command(gen); 
InitializeComponent(); 
lst.ItemsSource = viewModel.VM_Maze; 

public List<List<int>> VM_Maze 
    { 
     get { return model.Maze; } 
    } 

Ich weiß nicht, warum Änderungen in der Liste sind nicht in der Gui reflektiert werden. Kann mir bitte jemand helfen?

Dank

+2

Verwenden ObservableCollection statt List, Listen werden nicht über Änderungen auf ihrem Inhalt informieren. – Gusman

Antwort

3

Zuerst

VM_Maze Bedürfnisse ObservableCollection<ObservableCollection<int>> Typ sein.

Zweitens sind Sie alles in dieser Zeile nicht bindend:

lst.ItemsSource = viewModel.VM_Maze; 

Sie zuweisen es einfach. Das Binden, wie in {Binding PropertyName} in XAML, beinhaltet das Erstellen einer Binding class Instanz, die viele hilfreiche Sachen für Sie erledigt. Dieser Code wird eine tatsächliche Bindung schaffen

, das wird Benachrichtigungen behandeln und so weiter richtig:

Binding binding = new Binding { Source = viewmodel, Path = new PropertyPath("VM_Maze") }; 
BindingOperations.SetBinding(lst, ItemsControl.ItemsSourceProperty, binding); 

Wie Sie sehen können, ist es viel bequemer in XAML zu binden. Ihr ItemsSource="{Binding}" tut nichts. Wenn dieses Objekt viewmodel die tatsächliche DataContext für diese Ansicht ist, dann sollte ItemsSource="{Binding VM_Maze}" funktionieren.