2012-12-19 9 views
5

ho legato con successo una colonna in un DataGrid a una raccolta osservabile con gli oggetti che implementa l'interfaccia INotifyPropertyChanged:INotifyPropertyChanged Associazione a DataTemplate in GridColumn

Questo è il codice XAML:

<dxg:GridColumn Name="Name" FieldName="Stapel" DisplayMemberBinding="{Binding Path=Name}" /> 

e la proprietà nel classe di oggetti:

public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (value == _name) return; 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

Ma in un'altra colonna sto usando un modello:

<dxg:GridColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel> 
       <Rectangle Height="19" Width="19" Fill="{Binding Path=Data.StatusColor}"></Rectangle> 
     </StackPanel> 
    </DataTemplate> 
</dxg:GridColumn.CellTemplate> 

La proprietà Fill del rettangolo è legato ad una proprietà "calcolata":

public SolidColorBrush StatusColor 
{ 
    get 
    { 
     if (StapelStatus == StapelStatus.Neu) 
     { 
      return new SolidColorBrush(Colors.CornflowerBlue); 
     } 
     return new SolidColorBrush(Colors.DarkOrange); 
    } 
} 

Alcuni altri setter di proprietà, che cambiano il valore di StapelStatus chiedono

OnPropertyChanged("StatusColor"); 

ho pensato questo sarebbe sufficiente per cambiare anche il colore nel colore del rettangolo nella colonna della griglia. Ma sfortunatamente quando il StapelStatus viene modificato e OnPropertyChanged("StatusColor") viene chiamato la griglia non riflette questa modifica. Immagino di dover cambiare in qualche modo il binding nello DataTemplate. Qualcuno può darmi un consiglio?

+0

Perché devi 'Data.' nel percorso del legame StatusColor? – Jay

+0

Per essere sincero, non ho idea del perché. Ho trovato questo in un esempio funzionante. Se rimuovo i dati. il valore non apparirà affatto nel DataTemplate. –

+1

Sei sicuro che DataContext per DataTemplate sia corretto? Le proprietà Name e StatusColor della stessa classe? – snurre

risposta

0

Si trattava effettivamente di un problema di associazione nello XAML. Purtroppo non ho impostato la proprietà FieldName in GridColumn. Ho pensato che FieldName è utilizzabile solo in normali GridColumns che non hanno alcun Template.

Di seguito il codice XAML di lavoro per la colonna:

<dxg:GridColumn Header="" FieldName="StatusColor"> 
    <dxg:GridColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
       <Rectangle RadiusX="19" RadiusY="19" Height="19" Width="19" Stroke="Black" Fill="{Binding Path=Value}"></Rectangle> 
       </StackPanel> 
     </DataTemplate> 
    </dxg:GridColumn.CellTemplate> 
</dxg:GridColumn> 
1

Questo lavoro dovrebbe funzionare?

public Whatever StapelStatus 
{ 
    get { return _stapelStatus; } 
    set 
    { 
     _stapelStatus = value; 
     OnPropertyChanged("StapelStatus"); 
     StatusColor = value == StapelStatus.Neu ? new SolidColorBrush(Colors.CornflowerBlue) : new SolidColorBrush(Colors.DarkOrange); 
    } 
} 

public Brush StatusColor 
{ 
    get { return _statusColor; } 
    set 
    { 
     _statusColor = value; 
     OnPropertyChanged("StatusColor"); 
    } 
} 
+0

Ciao Snurre, grazie per il tuo suggerimento ma ottengo esattamente lo stesso comportamento. Il setter di StatusColor con "OnPropertyChanged (" StatusColor ")" verrà eseguito ma la griglia non riflette la modifica. –

Problemi correlati