2013-06-07 2 views
5

Мне нужно установить цвет текста, когда текст изменяется внутри текстового поля и соответствует определенному критерию. Я могу реализовать это из кода позади с textbox_textchanged event и set brushes.color до нужного цвета.Изменение цвета переднего плана текстового поля при изменении текста и соответствует определенному критерию

Но я не могу реализовать это с помощью подхода xaml wpf. Я новичок в wpf, я не уверен, как установить цвет текста в зависимости от определенного критерия при изменении текста в текстовом поле.

Например: для данного текстового поля при изменении текста необходимо определить , если текст ввода - это номер, а затем изменить цвет переднего плана на зеленый красный.

Ожидается помощь. Заранее спасибо.

ответ

2

Я не уверен, разрешен ли конвертер привязки в вашей ситуации. Но вот решение, которому нужен только конвертер привязки в вашем коде.

Вот код в XAML

<Grid.Resources> 
     <local:ValueConverter x:Key="ValueConverter"></local:ValueConverter> 
    </Grid.Resources> 
    <TextBox Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}"> 
     <TextBox.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=Text,Converter={StaticResource ValueConverter}}" Value="True"> 
         <Setter Property="TextBox.Foreground" Value="Red"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBox.Style> 
    </TextBox> 

Вот модель и вид преобразователя значение

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _text; 

    public string Text 
    { 
     get 
     { 
      return this._text; 
     } 
     set 
     { 
      this._text = value; 
      if (null != PropertyChanged) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs("Text")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class ValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (null != value) 
     { 
      if (value.ToString() == "1") 
       return true; 
     } 
     return false; 
    } 

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

Таким образом, решение использует триггер данных для достижения цели. Единственная причина использования конвертера привязки здесь заключается в том, что вам нужно место, чтобы определить, какое значение должно изменить передний план TextBox. Здесь передний план TextBox будет красным, если значение TextBox равно «1».

+0

Я реализовал это, и он отлично работает. Большое спасибо за помощь :) –

+0

@AarohiS Мне очень приятно. Не могли бы вы пометить мой пост как ответ на ваш вопрос? Большое спасибо. :) – Colin

1

Вы должны просто подключиться к событию TextChanged в wpf и связать метод с этим событием в XAML. Затем вы можете проверить, соответствуют ли новые значения вашим критериям и соответствующим образом меняют цвет.

Я не совсем уверен, что вы подразумеваете под «подходом XAML», но в этом случае, когда вы просто хотите присоединить поведение к событию, которое поднято на одном из ваших элементов управления, я не думаю, что это неправильно делать это так, как вы уже пробовали, используя TextChanged. Вот почему события видны в XAML в первую очередь.

+0

Спасибо.У меня это текстовое поле: и я закодированы как: частной ничтожной TextBox_TextChanged (объект отправителя, TextChangedEventArgs е) { если (txt_Test.Text == IsANumber) txt_Test.Foreground = Brushes.Red; else txt_Test.Foreground = Brushes.Green; } Но мне нужен другой подход, используя триггер/datatrigger от xaml или любым другим способом. –

+0

Я смущен, почему вы «нуждаетесь» в другом подходе? Я не вижу ничего плохого в том, как ты сейчас делаешь. Это требование от вашего работодателя или что-то еще? –

+0

Да, это требование использовать xaml-подход, а не за оценкой кода. –

0

Проверьте длину строки в текстовом поле, которое записывается на каждом входе. Если это> 10 или что вы хотите, то измените цвет. Вы также можете сделать этот триггер кнопкой, которая была выделена серым цветом.

Пример:

MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height); 
0

Pure XAML? , вы можете посмотреть на интерактивность, взаимодействие, триггеры?

Using EventTrigger in XAML for MVVM – No Code Behind

IMMO Я думаю, что лучше подключить к коду свойств/конвертеры/расширений, и т.д. ... для лучшего повторного использования кода, но, конечно, субъективное к мнениям ... и в конце концов, всегда тебе.

 Смежные вопросы

  • Нет связанных вопросов^_^