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

问题描述 投票:0回答:1

我有一个名为

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

silverlight mvvm coding-style
1个回答
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>

您可以找到

BoolToStyleConverter
的基础是基于这篇博客文章。 创建为:-

public class BoolToStyleConverter : BoolToValueConverter<Style> { }
© www.soinside.com 2019 - 2024. All rights reserved.