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が更新されないという問題があります。
何が問題なのですか?
'SudokuBoxViewModel'は' INotifyPropertyChanged'を実装していますか? – Vlad
あります(そうでない場合、RaisePropertyChangedメソッドはありません)。 – chrischu
'SudokuBox'のコードも載せてください。 – Vlad