2010-12-04 15 views
0

J'ai un problème avec WPF et MVVM. J'ai créé un Sudokufield composé de 3 classes:WPF/MVVM: Pourquoi mon interface graphique ne se met-elle pas à jour?

  • SudokuFieldViewModel: Tout le champ de jeu (se compose de 3 * 3 SudokuFieldBlockViewModels)
  • SudokuBlockViewModel: Un bloc de 3 * 3 SodokuBoxViewModels
  • SudokuBoxViewModel: Une boîte où nombre entre 1 et 9 peut être entré

Le SudokuBoxViewModel a une propriété IsHighlighted-de type bool.

J'ai créé une méthode Surlignage dans le modèle SudokuFieldViewModel qui appelle une méthode Highlight sur chaque modèle SudokuBlockViewModel qui définit alors IsHighlighted sur true pour tous les modèles SudokuBoxViewModels.

La propriété en BoxViewModel ressemble à ceci:

private bool m_IsHighlighted = false; 
    public bool IsHighlighted 
    { 
     get 
     { 
      return m_IsHighlighted; 
     } 

     set 
     { 
      if (m_IsHighlighted != value) 
      { 
       m_IsHighlighted = value; 
       RaisePropertyChanged("IsHighlighted"); 
      } 
     } 
    } 

Les vues sont dans une layed manière FieldView a un ItemsControl avec DataTemplates se liant aux BlockViewModels dans le FieldViewModel. Le même concept s'applique à BoxViewModels dans le BlockViewModel.

SudokuBlock:

<UserControl x:Class="SuSo.SudokuBlock" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
    <SuSo_Common:HighlightConverter x:Key="HighlightConverter"/> 
     <DataTemplate x:Key="BlockBoxTemplate"> 
      <Grid> 
       <local:SudokuBox DataContext="{Binding}" /> 
      </Grid> 
     </DataTemplate> 
    </UserControl.Resources> 
    <Border BorderThickness="1" BorderBrush="Black"> 
     <ItemsControl ItemsSource="{Binding Elements, Mode=OneWay}" ItemTemplate="{DynamicResource BlockBoxTemplate}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid 
         Rows="{Binding Size, Mode=OneWay}" 
         Columns="{Binding Size, Mode=OneWay}" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Border> 
</UserControl> 

SudokuBox:

<UserControl x:Class="SuSo.SudokuBox" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
    <SuSo_Common:HighlightConverter x:Key="HighlightConverter"/> 
     <DataTemplate x:Key="NumberTemplate" DataType="int"> 
      <Grid> 
       <Viewbox Stretch="Fill" d:LayoutOverrides="Width, Height" > 
        <TextBlock x:Name="possibleNumber" Text="{Binding Mode=OneWay}" FontFamily="Hobo Std" TextAlignment="Center" Height="Auto" Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding ActualHeight, ElementName=possibleNumber, Mode=OneWay}" /> 
       </Viewbox> 
      </Grid> 
     </DataTemplate> 
    </UserControl.Resources> 
    <UserControl.DataContext> 
      <local:SudokuBoxViewModel Size="3" /> 
    </UserControl.DataContext> 
    <Border BorderThickness="1" BorderBrush="Black" Background="{Binding IsHighlighted, Converter={StaticResource HighlightConverter}}"> 
     <ItemsControl ItemsSource="{Binding Elements, Mode=OneWay}" ItemTemplate="{DynamicResource NumberTemplate}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid 
         Rows="{Binding Size, Mode=OneWay}" 
         Columns="{Binding Size, Mode=OneWay}" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Border> 
</UserControl> 

Le BoxView se lie à IsHighlighted et utilise un ValueConverter pour convertir la valeur d'un booléen à SolidColorBrush qui est utilisé comme base pour la BoxView.

Le problème est cependant que l'interface graphique ne se met pas à jour lorsque j'appelle la fonction Highlight.

Quel pourrait être le problème?

+0

Est-ce que 'SudokuBoxViewModel' implémente' INotifyPropertyChanged'? – Vlad

+0

Oui, oui (sinon, il n'y aurait pas de méthode RaisePropertyChanged). – chrischu

+0

Okay. Pourriez-vous s'il vous plaît poster le code pour 'SudokuBox' aussi bien? – Vlad

Répondre

0

Oh mon dieu!

Les lignes

<UserControl.DataContext> 
     <local:SudokuBoxViewModel Size="3" /> 
</UserControl.DataContext> 

étaient le problème (il devient assez évident maintenant ..).

J'ai enlevé ceci et maintenant cela fonctionne comme il se doit :).