2010-12-04 72 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> 

是问题(现在变得很明显。)。

我删除了这个,现在它工作,因为它应该:)。

相关问题