2010-12-04 18 views
0

WPFとMVVMに問題があります。WPF/MVVM:GUIが更新されないのはなぜですか?

  • SudokuFieldViewModel:全体の競技場(3 * 3 SudokuFieldBlockViewModelsで構成)
  • SudokuBlockViewModel:3 * 3 SodokuBoxViewModelsの1つのブロック
  • SudokuBoxViewModel:ボックス私はSudokufieldは、3つのクラスから成る作成しました1〜9の数値を入力できます。

SudokuBoxViewModelには、bool型のIsHighlightedプロパティがあります。

すべてのSudokuBlockViewModelでHighlightメソッドを呼び出し、すべてのSudokuBoxViewModelsに対してIsHighlightedをtrueに設定するSudokuFieldViewModelでHighlightメソッドを作成しました。

BoxViewModel内のプロパティは、次のようになります

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

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

ビューは、FieldViewをがFieldViewModelでBlockViewModelsに結合DataTemplatesとのItemsControlを持っているような方法でレイアウトされています。同じ概念がBlockViewModelのBoxViewModelに適用されます。

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> 

BoxView内はIsHighlightedに結合し、BoxView内の背景として使用されたSolidColorBrushにブール値に変換するValueConverterを使用します。

ただし、ハイライト機能を呼び出すとGUIが更新されないという問題があります。

何が問題なのですか?

+0

'SudokuBoxViewModel'は' INotifyPropertyChanged'を実装していますか? – Vlad

+0

あります(そうでない場合、RaisePropertyChangedメソッドはありません)。 – chrischu

+0

'SudokuBox'のコードも載せてください。 – Vlad

答えて

0

ああ私の神!

ライン

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

(それは今かなり明白になり...)問題でした。

これを削除しましたが、今のように動作します:)。

関連する問題