2009-12-18 10 views
0

mon problème est ici: J'ai une classeWPF DataGrid respecte pas le changement de valeur de la propriété de l'article

public class Component 
{ 
    ... 
    private ServiceController service; 

    ... 
    public int ServiceStatus 
    { 
     get 
     { 
      switch(service.Status) 
      { 
       case ServiceControllerStatus.Stopped: 
        return 0; 

       case ServiceControllerStatus.Running: 
        return 1; 

       default: 
        return 2; 
      } 
     } 
    } 
    public void QueryService() 
    { 
     service.Refresh(); 
    } 
} 

et collection de composants, a déclaré dans une autre classe:

public class Motivation 
{ 
    // Downloaded data 
    ... 
    private ObservableCollection<Component> components; 
    public ObservableCollection<Component> Components 
    { 
     get { return components; } 
    } 

    public bool CheckServices() 
    { 
     bool changed = false; 
     foreach (Component C in components) 
     { 
      int prevStatus = C.ServiceStatus; 
      C.QueryService(); 

      if (prevStatus != C.ServiceStatus) 
       changed = true; 
     } 

     return changed; 
    } 

Cette liste des composants affichés dans WPF DataGrid. Mon idée: couleur de fond vert pour les services en cours d'exécution, rouge - pour arrêté. Fonctionne bien, mais seulement au début. CheckServices() appelé par timer, et si la valeur retournée est True, je veux réécrire ma grille, en respectant les nouveaux états de service. Voici XAML:

<Style x:Key="ServiceStateStyle" TargetType="z:DataGridRow"> 
     <Setter Property="Background" Value="Gray" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=ServiceStatus}" Value="0"> 
       <Setter Property="Background" Value="LightCoral" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=ServiceStatus}" Value="1"> 
       <Setter Property="Background" Value="LightGreen" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    <z:DataGrid Grid.Row="0" 
       Grid.ColumnSpan="4" 
       AutoGenerateColumns="False" 
       x:Name="DataGridComponents" 
       ItemContainerStyle="{DynamicResource ServiceStateStyle}"> 
       <z:DataGrid.Columns> 
         <z:DataGridTextColumn IsReadOnly="True" 
          Header="Component" Width="80" 
          Binding="{Binding Path=DisplayName}"/> 
        </z:DataGrid.Columns> 
       </z:DataGrid> 

Devrais-je appeler une méthode explicite pour invalider DataGrid? J'ai essayé avec InvalidateProperty, InvalidateVisual, GetBindingExpression (ItemContainerStyleProperty) .UpdateTarget(), mais rien ne fonctionne. Quelqu'un peut-il aider?

Répondre

0

La classe Component doit implémenter INotifyPropertyChanged et déclencher l'événement lorsque certaines de ses propriétés sont modifiées.

+0

Son travail! Super et simple. Je vous remercie. – Pavel