WPF / MVVM:为什么我的GUI没有更新?

时间:2010-12-04 16:08:49

标签: wpf user-interface mvvm

我遇到WPF和MVVM的问题。我创建了一个由3个类组成的Sudokufield:

  • SudokuFieldViewModel:整个比赛场地(由3 * 3 SudokuFieldBlockViewModels组成)
  • SudokuBlockViewModel:一块3 * 3 SodokuBoxViewModels
  • SudokuBoxViewModel:可以输入1到9之间的数字的框

SudokuBoxViewModel具有bool类型的IsHighlighted属性。

我在SudokuFieldViewModel中创建了一个方法Highlight,它在每个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有一个ItemsControl,DataTemplates绑定到FieldViewModel中的BlockViewModel。同样的概念适用于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并使用ValueConverter将bool值转换为用作BoxView背景的SolidColorBrush。

但问题是当我调用Highlight函数时GUI不会更新。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

天哪啊!

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

是问题(现在变得非常明显......)。

我删除了它,现在它可以正常工作:)。