Как я могу динамически изменять метку в зависимости от значения слайдера? - PullRequest
1 голос
/ 17 ноября 2011

Я пишу калькулятор оценок, и в настоящее время у меня есть ползунок с текстовым полем рядом с ним, который отображает текущее значение ползунка:

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

Но метка просто остается «Пропустить» независимо от значения ползунка.Может кто-нибудь, пожалуйста, посоветуйте мне, где я иду не так?Я попытался использовать Content = "{Binding Source = gradeText}" на Label xaml и удалить gradeClass.Content в коде, но он пожаловался, что gradeText был объявлен, но никогда не использовался.Большое спасибо всем, кто может помочь.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

«Правильный» способ сделать это - связать их оба со свойством «Grade» в ViewModel и добавить ValueConverter , чтобы преобразовать числовое свойство в желаемое текстовое значение на вашем ярлыке.

2 голосов
/ 17 ноября 2011

Самый простой способ - привязать содержимое 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.html, http://www.dev102.com/2008/07/17/wpf-binding-converter-best-practices/

Но, как ни печально, «истинный» способ - использовать шаблон MVVM, а не связывать элементы управления, а привязывать элементы управления к свойствам ViewModel и затем использовать конвертеры.

Обновление: одна отличная тема о конвертерах: Должен ли я объявлять конвертеры в App.xaml или как файловый ресурс?

2 голосов
/ 17 ноября 2011

Вы можете использовать привязку для таких ярлыков, как 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...