Silverlight~MVVM~基于模型值的Style属性的动态设置

时间:2010-06-08 17:18:12

标签: silverlight mvvm coding-style

我有一个名为Question的课程,代表一个问题而且是答案。我有一个应用程序,呈现一个Question对象的ObservableCollection。每个Question都呈现为StackPanel,其中包含问题词汇的TextBlock和用于输入答案的TextBox。问题是使用ItemsControl呈现的,我最初使用名为“ IncorrectQuestion ”的StaticResource键设置了问题的StackPanel样式(在页面的UserControl.Resources部分中定义)。在UserControl.Resources部分中,我还定义了一个键标记' CorrectQuestion ',当用户正确回答问题时,我需要以某种方式应用于问题的StackPanel。我的问题是我不确定如何动态更改StackPanel的样式,特别是在ViewModel类的约束内(即我不想在View的代码隐藏中放置任何样式选择代码)。我的Question类具有IsCorrect属性,在应对更正时可以准确设置该属性。我想以某种方式反映样式选择形式的IsCorrect值。我该怎么做?

1 个答案:

答案 0 :(得分:3)

使用值转换器是一种解决方案。

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.Resources>
        <local:BoolToStyleConverter x:Key="Correctness">
            <local:BoolToStyleConverter.FalseValue>
                <Style TargetType="TextBox">
                    <Setter Property="Background" Value="Salmon" />
                </Style>
            </local:BoolToStyleConverter.FalseValue>
            <local:BoolToStyleConverter.TrueValue>
                <Style TargetType="TextBox">
                    <Setter Property="Background" Value="AliceBlue" />
                </Style>
            </local:BoolToStyleConverter.TrueValue>
        </local:BoolToStyleConverter>
    </Grid.Resources>
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Question}" />
                    <TextBox x:Name="Answer" Text="{Binding Answer, Mode=TwoWay}"
                       Style="{Binding IsCorrect, Converter={StaticResource Correctness}}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>        
</Grid>

您可以根据此blog post找到BoolToStyleConverter的基础。 创建为: -

public class BoolToStyleConverter : BoolToValueConverter<Style> { }