2014-11-03 3 views
0

Я получаю статус нескольких элементов из переменных в моем коде, и я хотел бы отображать статус этих элементов графически на каждой вкладке в моем графическом интерфейсе. Я показываю статус как цветная метка (3 разных цвета представляют 3 разных состояния). Я выяснил, как заставить фон менять цвета с помощью куча кода, но я думаю, что использование триггеров данных было бы лучше, но я не смог заставить его работать. Используя отладчик, он выполняет процедуры и правильно изменяет значения, но цвета на экране никогда не меняются. Кстати, я работал только с wpf и C# около 6 недель. Заранее благодарю за указание на мои ошибки.Как связать Label.Background с переменной

Вот мой класс:

class componentStatus : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    private int _icc1status; 
    public int Icc1status 
    { 
     get 
     { 
      return this._icc1status; 
     } 

     set 
     { 
      if (value != this._icc1status) 
      { 
       this._icc1status = value; 
       NotifyPropertyChanged("Icc1status"); 
      } 
     } 
    } 

    private int _icc2status; 
    public int Icc2status 
    { 
     get 
     { 
      return this._icc2status; 
     } 

     set 
     { 
      if (value != this._icc2status) 
      { 
       this._icc2status = value; 
       NotifyPropertyChanged("Icc2status"); 
      } 
     } 
    } 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Вот XAML:

 <Style x:Key="Icc2Status" TargetType="{x:Type Label}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Icc2status, UpdateSourceTrigger=PropertyChanged}" Value="2"> 
       <Setter Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Icc2status, UpdateSourceTrigger=PropertyChanged}" Value="1"> 
       <Setter Property="Background" Value="Yellow"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Icc2status, UpdateSourceTrigger=PropertyChanged}" Value="0"> 
       <Setter Property="Background" Value="Green"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Label x:Name="icc2statusLabel" Style="{DynamicResource Icc2Status}" Content="ICC 2" HorizontalContentAlignment="Center" HorizontalAlignment="Right" Margin="0,0,260,0" VerticalAlignment="Top" Width="45" Foreground="Black" BorderThickness="1" BorderBrush="Black"/> 

И мой код позади:

public partial class MainWindow : Window 
{ 

    componentStatus compStatus = new componentStatus(); 

    public static readonly DependencyProperty myComponentProperty = 
     DependencyProperty.Register("Icc2status", typeof(int), typeof(Label), new PropertyMetadata(null)); 

    //GUI for Invent Program 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    //This button is for test purposes only 
    private void test_Click(object sender, RoutedEventArgs e) 
    { 
     compStatus.Icc1status = 2; 
     compStatus.Icc2status = 1; 
    } 

    //Routine to force color change of the system state when it changes 
    //I think data triggers are probably a better option 
    private void component_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     //Get the new component status 
     //if (compStatus.Icc1status == 0) icc1statusLabel.Background = new SolidColorBrush(Colors.Green); 
     //if (compStatus.Icc1status == 1) icc1statusLabel.Background = new SolidColorBrush(Colors.Yellow); 
     //if (compStatus.Icc1status == 2) icc1statusLabel.Background = new SolidColorBrush(Colors.Red); 
    } 
} 

ответ

0

Связующие пути относительно вашего DataContext, поэтому изменить DataContext от this до compStatus. Кроме того, избавьтесь от своего myComponentProperty, так как он, похоже, не служит никакой цели здесь.

+0

Работы прекрасно. Спасибо за быстрый ответ. Я застрял на этом в течение 3 дней. – mkk

0

Неверный DataContext. Он должен быть установлен в compStatus.

this.DataContext = compStatus; 
Смежные вопросы