我如何能有一个标签根据滑块值动态变化
本文关键字:动态 变化 何能 有一个 标签 | 更新日期: 2023-09-27 18:15:11
我正在编写一个成绩计算器,我目前有一个滑动条,旁边有一个文本框,显示滑动条的当前值:
<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;
}
但是无论滑块的值如何,标签都保持为"传递"。谁能告诉我哪里做错了吗?我尝试在标签xaml上使用Content = "{Binding Source = gradeText}"
并删除代码中的gradeClass.Content
,但它抱怨gradeText被声明但从未使用过。非常感谢所有帮助我的人。
最简单的方法是将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>
And converter是一个类,实现了IValueConverter接口。关于转换器的好文章:http://www.wpftutorial.net/ValueConverters.html,http://www.dev102.com/2008/07/17/wpf-binding-converter-best-practices/
但是正如Yaur所说,"真正的"方法是使用MVVM模式,而不是在控件之间绑定,而是将控件绑定到ViewModel属性,然后使用转换器。
更新:一个关于转换器的伟大线程:我应该在App.xaml中声明转换器还是作为每个文件的资源?
你可以在标签上使用绑定,比如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;
}
}
正确的方法是将它们绑定到ViewModel上的"Grade"属性,并添加ValueConverter将数值属性转换为标签上所需的文本值