2010-12-04 66 views
0

我有一個WPF和MVVM的問題。我創建由3類的Sudokufield:WPF/MVVM:爲什麼我的GUI不更新?

  • SudokuFieldViewModel:整個比賽場地(包括3×3 SudokuFieldBlockViewModels)
  • SudokuBlockViewModel:塊的3×3的一個SodokuBoxViewModels
  • SudokuBoxViewModel:一個盒,其中一可輸入1到9之間的數字

SudokuBoxViewModel具有類型爲bool的IsHighlighted-屬性。

我在SudokuFieldViewModel中創建了一個突出方法,該方法在每個SudokuBlockViewModel上調用Highlight方法,然後將所有SudokuBoxViewModel的IsHighlighted設置爲true。

在BoxViewModel屬性看起來是這樣的:

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

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

的意見的方式的FieldView具有的DataTemplates結合在FieldViewModel的BlockViewModels一個ItemsControl奠定了。相同的概念適用於BlockViewModel中的BoxViewModels。

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並使用ValueConverter到布爾值轉換成被用作背景的一個BoxView中的SolidColorBrush。

然而問題是當我調用突出顯示功能時GUI不會更新。

可能是什麼問題?

+0

`SudokuBoxViewModel`是否實現了`INotifyPropertyChanged`? – Vlad 2010-12-04 16:13:19

回答

0

天啊!

線條

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

是問題(現在變得很明顯。)。

我刪除了這個,現在它工作,因爲它應該:)。