2009-09-27 6 views
12

Qualcuno ha una soluzione efficace per la modifica di uno stile in silverlight in base a una proprietà dell'oggetto dati sottostante, nel senso che quando il valore cambia, lo stile. Ho usato brevemente WPF e ovviamente ha il DataTrigger che sembra coprire questo ma manca in Silverlight.Silverlight che modifica gli stili in base a un valore di proprietà dell'oggetto (es. DataTrigger)

ho trovato questo: http://blois.us/blog/2009/04/datatrigger-bindings-on-non.html

Ma non sembra applicarsi a styling ..

Grazie per il vostro tempo

risposta

10

Silverlight non contiene un DataTemplateSelector, che viene utilizzato per selezionare un modello di dati basato sull'elemento associato ai dati e l'oggetto dati. Ma non è difficile costruirne uno tuo.

Iniziare con una classe che eredita da System.Windows.Controls.ContentControl. Questa classe ha una proprietà per un modello di dati e una proprietà per il contenuto, che è possibile utilizzare per associare. Creare un override del metodo OnContentChanged come questo

protected override void OnContentChanged(object oldContent, object newContent) 
{ 
} 

preferisco mettere i modelli in un dizionario a parte, nel caso in cui ho bisogno di condividerli tra i progetti. In questo metodo, il modello di questo controllo viene impostato su un modello selezionato dal dizionario. Qualcosa di simile:

Switch(DataStatus){ 
    case 0: ContentTemplate = LoadFromDictionary(
           "DataTemplateDemo;component/DataTemplates.xaml", 
           "Status0Template"); 
      break; 
    case 1: ContentTemplate = LoadFromDictionary(
           "DataTemplateDemo;component/DataTemplates.xaml", 
           "Status1Template"); 
      break; 
    //etc  
} 

in questo caso l'dovrebbe essere un nome DataTemplates.xaml dizionario con un paio di modelli di dati.

Nel file XAML, utilizzare la classe di selezione modello come il modello della lista:

<ListBox x:Name="AnInterrestingList"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <DataTemplateDemo:DateTemplateSelector Content="{Binding}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Io uso questo metodo di supporto come qui sotto per prelevare i modelli da dizionari:

public static DataTemplate LoadFromDictionary(string dictionary, 
               string template) 
{ 
    var doc = XDocument.Load(dictionary); 
    var dict = (ResourceDictionary)XamlReader 
        .Load(doc.ToString(SaveOptions.None)); 
    return dict[template] as DataTemplate; 
} 

Aggiornamento

Nel frattempo ho scritto un post con un codice di esempio su questo argomento. È disponibile su my blog.

+0

State cercando qualcosa di simile !, Google + You = Grazie! –

+0

Sorskoot: il tuo post sul blog non sembra più disponibile. C'è un nuovo link? – kindohm

+0

Grazie .. Ho aggiornato il collegamento ... – Sorskoot

Problemi correlati