我有一個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