WPF / MVVM: Почему мой графический интерфейс не обновляется? - PullRequest
0 голосов
/ 04 декабря 2010

У меня проблема с 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.

Проблема, однако, заключается в том, что графический интерфейс не обновляется при вызове функции выделения.

В чем может быть проблема?

1 Ответ

0 голосов
/ 04 декабря 2010

Боже мой!

Линии

<UserControl.DataContext>
        <local:SudokuBoxViewModel Size="3" />
</UserControl.DataContext>

были проблемы (теперь это становится довольно очевидным ..).

Я удалил это, и теперь оно работает как надо:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...