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

C# 如何根据滑块值动态更改标签?,c#,wpf,C#,Wpf,我正在编写一个成绩计算器,目前我有一个滑块,旁边有一个文本框,显示滑块的当前值: <Slider Name="gradeSlider" Grid.Row="3" Grid.Column="2" VerticalAlignment="Center" Minimum="40" Maximum="100" IsSnapToTickEnabled=

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

    <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;
        }
字符串文本;
如果(gradeSlider.Value>=40&&gradeSlider.Value<50)
{
gradeText=“通过”;
gradeClass.Content=gradeText;
}
否则如果(gradeSlider.Value>=50&&gradeSlider.Value<60)
{
gradeText=“2:2”;
gradeClass.Content=gradeText;
}
其他的
{
gradeText=“如此…”;
gradeClass.Content=gradeText;
}

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

您可以使用标签上的绑定(如TextBox)和转换器类将滑块值转换为所需文本

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;
    }
}

“正确”的方法是将它们都绑定到ViewModel上的“Grade”属性,并添加一个用于将数值属性转换为标签上所需的文本值的属性。最简单的方法是将标签内容绑定到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>

converter是一个实现IValueConverter接口的类。 关于转换器的好文章: ,

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

更新:关于转换器的一个重要线索: