如何根据滑块值动态更改标签?

时间:2011-11-17 09:38:37

标签: c# wpf

我正在写一个成绩计算器,我现在有一个滑块,旁边有一个文本框,显示滑块的当前值:

    <Slider Name="gradeSlider"
            Grid.Row="3"
            Grid.Column="2"
            VerticalAlignment="Center"
            Minimum="40"
            Maximum="100"
            IsSnapToTickEnabled="True"
            TickFrequency="5" 
            TickPlacement="BottomRight"/>
    <TextBox Name="targetGrade"
             Grid.Row="3"
             Grid.Column="3"
             Width="30"
             Height="23"
             Text="{Binding ElementName=gradeSlider, Path=Value}"
             TextAlignment="Center"/>

但是我很难添加一个标签,根据滑块的值范围显示不同的等级分类。我原以为我可以创建标签:

<Label     Name="gradeClass"
           Grid.Row="2"
           Grid.Column="2"
           HorizontalAlignment="Center"
           VerticalAlignment="Bottom"/>

然后使用代码:

        string gradeText;

        if (gradeSlider.Value >= 40 && gradeSlider.Value < 50)
        {
            gradeText = "Pass";
            gradeClass.Content = gradeText;
        }
        else if (gradeSlider.Value >= 50 && gradeSlider.Value < 60)
        {
            gradeText = "2:2";
            gradeClass.Content = gradeText;
        }
        else
        {
            gradeText = "so on...";
            gradeClass.Content = gradeText;
        }

但是无论滑块值如何,标签都会保持为“Pass”。有人可以告诉我哪里出错了吗?我尝试在标签xaml上使用Content = "{Binding Source = gradeText}"并删除代码中的gradeClass.Content,但它抱怨已声明gradeText但从未使用过。非常感谢任何可以提供帮助的人。

3 个答案:

答案 0 :(得分:2)

您可以在TextBox和 Converter 类等标签上使用绑定,将滑块值转换为所需文本。

public class SliderToTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        // Do the conversion from Slider.Value(int) to Text
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return null;
    }
}

答案 1 :(得分:2)

&#34;对&#34;这样做的方法是将它们绑定到&#34;等级&#34; ViewModel上的属性,并添加ValueConverter以将数字属性转换为标签上的所需文本值。

答案 2 :(得分:2)

最简单的方法是将Label内容绑定到Slider的值并添加转换器,如下所示:

<Label Name="gradeClass"
       Grid.Row="2"
       Grid.Column="2"
       Text="{Binding ElementName=gradeSlider, Path=Value, Converter={StaticResource SliderValueToTextConverter}}"
       HorizontalAlignment="Center"
       VerticalAlignment="Bottom"/>

有几种方法可以定义转换器。例如,您可以在主机元素资源中定义它,比如说您将所有这些控件放在窗口中,然后:

<Window.Resources>
    <convertors:SliderValueToTextConverter x:Key="SliderValueToTextConverter" />
</Window.Resources>

转换器是一个类,它实现了IValueConverter接口。 关于转换器的好文章: http://www.wpftutorial.net/ValueConverters.htmlhttp://www.dev102.com/2008/07/17/wpf-binding-converter-best-practices/

但是,正如Yaur悲伤 - “真正的”方式是使用MVVM模式而不是在控件之间绑定,而是将控件绑定到ViewModel属性,然后使用转换器。

更新:关于转换器的一个很棒的主题: Should I declare converters in App.xaml or as a per-file resource?