2016-04-27 116 views
0

我已經建立了具有XAML看起來像這樣的窗口:WPF數據綁定更新不及時

<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> 

現在我得到的所有的信息在「LST」從2D列表存儲在我的模型中。在運行時,當我更改列表中的值時,所有更改都不會顯示在網格中。

我如何確保這種情況發生?

這是的.cs

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

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

裝訂線我不知道爲什麼在列表的變化沒有被反映在GUI中。 任何人都可以幫忙嗎?

由於

+2

使用的ObservableCollection名單,名單不會告知它的內容的修改。 – Gusman

回答

3

首先,

VM_Maze需要是ObservableCollection<ObservableCollection<int>>類型。

其次,你在這行綁定任何東西:

lst.ItemsSource = viewModel.VM_Maze; 

你只是分配給它。綁定(如XAML中的{Binding PropertyName})涉及創建Binding class實例,該實例爲您提供了大量有用的內容。

此代碼將創建一個實際的結合,那將處理通知等正常:

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

正如你所看到的,它更方便地在XAML綁定。您的ItemsSource="{Binding}"不會執行任何操作。 如果這個對象viewmodel是該視圖的實際DataContext,那麼ItemsSource="{Binding VM_Maze}"應該工作。