У меня проблема с WPF и MVVM.Я создал Sudokufield, состоящий из 3 классов:
- SudokuFieldViewModel: все игровое поле (состоит из 3 * 3 SudokuFieldBlockViewModels)
- SudokuBlockViewModel: один блок из 3 * 3 SodokuBoxViewModels
- SudokuBoxViewModel: поле, в которое можно ввести число от 1 до 9
SudokuBoxViewModel имеет свойство IsHighlighted типа bool.
Я создал метод Highlight вSudokuFieldViewModel, который вызывает метод Highlight для каждого SudokuBlockViewModel, который затем устанавливает значение IsHighlighted в true для всех моделей SudokuBoxViewModel.
Свойство в BoxViewModel выглядит следующим образом:
private bool m_IsHighlighted = false;
public bool IsHighlighted
{
get
{
return m_IsHighlighted;
}
set
{
if (m_IsHighlighted != value)
{
m_IsHighlighted = value;
RaisePropertyChanged("IsHighlighted");
}
}
}
Представления расположены вспособ, которым у FieldView есть ItemControl с привязкой DataTemplates к BlockViewModels в FieldViewModel.Та же концепция применима к BoxViewModels в BlockViewModel.
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 для преобразованияЗначение bool для SolidColorBrush, которое используется в качестве фона для BoxView.
Проблема, однако, заключается в том, что графический интерфейс не обновляется при вызове функции выделения.
В чем может быть проблема?