2012-06-27 3 views
1

У меня есть DataTemplate, который используется в ListBox:Как изменить цвет шрифта списка данных, привязанного к datatemplated, используя конвертер?

<local:BooleanToFontColorConverter x:Key="boolToFontColor" /> 
<DataTemplate x:Key="ListBox_DataTemplateSpeakStatus"> 
    <Label Width="Auto"> 
      <TextBlock Name="MY_TextBlock" Text="Hello!" Foreground="{Binding Path=MY_COLOR, Converter={StaticResource boolToFontColor}}" /> 
    </Label> 
</DataTemplate> 

MY_COLOR является следующий фрагмент кода:

public class Packet_Class : INotifyPropertyChanged 
    { 
     private bool _my_color = false; 
     public bool MY_COLOR { get { return _my_color; } 
             set { _my_color = value; RaisePropertyChanged("MY_COLOR"); } } 
    } 

, а затем, при необходимости я установить свойство, которое я думаю, было бы уволить RaisePropertyChanged функция

myPacketClass.MY_COLOR = true; 

в то время как boolToFontColor "пытается" использовать этот бит:

public class BooleanToFontColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture) 
    { 
     if (value is Boolean) 
     { 
      return ((bool)value) ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Black); 
     } 

     return new SolidColorBrush(Colors.Black); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Когда я изменяю значение MY_COLOR с true на false или наоборот, я не вижу видимых изменений в тексте переднего плана во время выполнения. Кто-нибудь может дать совет относительно того, где я ошибаюсь? Большое спасибо и благодарю вас заранее.

EDIT:

Некоторая дополнительная информация, чтобы попытаться обеспечить большую ясность. Я использую мой DataTemplate в ListBox, как это:

<ListBox x:Name="MyUserList" ItemTemplate="{StaticResource ListBox_DataTemplateSpeakStatus}" SelectionMode="Extended" /> 

И в моем окне WPF элементе я создал мои локальное пространство имен в пространстве имен, что мой MainWindow.xaml.cs инкапсулируется в:

xmlns:local ="clr-namespace:My_NameSpace" 
+0

Вы поднимаете PropertyChanged, когда установлен MY_COLOR? –

+0

Я не был, я довольно новичок в этом материале :) Я редактировал свое оригинальное сообщение для чего-то, что, на мой взгляд, имеет смысл после изучения функции RaisedPropertyChanged. Он по-прежнему не работает, как я мог бы подумать ... на самом деле он никогда не ломается в мою функцию конвертера. Спасибо за ваш ответ/предложение. –

+0

Что такое 'myPacketClass.PacketHandRaised = true?' For? Вы имеете в виду 'MY_COLOR = true'? –

ответ

3

метод RaisePropertyChanged должен поднять событие PropertyChanged определить в интерфейсе и выглядит следующим образом:

public event PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged (string propertyName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

преобразователь:

public class BooleanToFontColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
       CultureInfo culture) 
    { 
     if (value is Boolean) 
     { 
      return ((bool)value) ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Black); 
     } 

     return new SolidColorBrush(Colors.Black); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Чтобы заставить его работать, вы должны использовать SolidColorBrush.

Он работает на моей среде, сообщите мне, если у вас возникнут какие-либо проблемы.

+0

Благодарим за отзыв. Я изменил конвертер на использование SolidColorBrush и отредактировал мою начальную запись, чтобы это отразить. Это все еще не работает для меня. Во время отладки я установил точки останова почти везде. Он ломается в свойстве во время набора, он ломается в функции RaisePropertyChanged, но он никогда не ломается внутри конвертера. Следовательно, цвет шрифта никогда не изменяется на красный, а значение равно «true». Может ли это указать на мою потенциальную проблему? Еще раз спасибо за понимание. –

+0

Я перепробовал и все отлично работает. Я старался быть как можно ближе к вашему коду .. Дайте мне больше информации: в каком контексте вы используете свой шаблон данных (я пытался использовать ListBox), вы уверен, что привязка к шаблону в порядке? и привязка к данным (между списком Packet_Class и listBox в моем случае)? как вы устанавливаете пространство имен (локальное)? Вы ссылаетесь на свой ResourceDictionary в app.xaml или на странице? – astreal

+0

При дальнейшей отладке кажется, что моя строка «if (PropertyChanged! = Null)» терпит неудачу. Поэтому мое публичное событие равно null:/ –