我有一个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不会更新。
可能是什么问题?
`SudokuBoxViewModel`是否实现了`INotifyPropertyChanged`? – Vlad 2010-12-04 16:13:19