2009-09-27 17 views
12

Czy ktoś ma pomyślne obejście tego problemu w celu zmiany stylu w silverlight na podstawie właściwości obiektu danych, w którym to przypadku zmienia się wartość i styl. Użyłem WPF krótko i oczywiście ma DataTrigger, który wydaje się to obejmować, ale brakuje go w Silverlight.Style zmiany Silverlight na podstawie wartości właściwości obiektów (np. DataTrigger)

Znalazłem to: http://blois.us/blog/2009/04/datatrigger-bindings-on-non.html

Ale to nie wydaje się mieć zastosowanie do stylizacji ..

Dzięki za poświęcony czas

Odpowiedz

10

Silverlight nie zawiera DataTemplateSelector, który jest używany do wybierz szablon danych oparty na elemencie związanym z danymi i obiekcie danych. Ale nie jest trudno budować własne.

Zacznij od klasy, która dziedziczy po System.Windows.Controls.ContentControl. Ta klasa ma właściwość dla szablonu danych i właściwość dla treści, z której można powiązać. Załóż przesterowania metody OnContentChanged jak ten

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

wolę umieścić szablony w osobnym słownika, tylko w przypadku muszę podzielić je między projektami. W tej metodzie ustaw szablon tej kontrolki na szablon wybrany ze słownika. Coś takiego:

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

w tym przypadku powinna to być nazwa słownika DataTemplates.xaml z kilkoma szablonami danych.

W pliku XAML użyć klasy wyboru szablonu jako szablonu listy:

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

używam tej metody pomocnika jak poniżej retreive szablonów ze słowników:

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; 
} 

Aktualizacja

W międzyczasie napisałem blog z przykładowym kodem na ten temat. Jest dostępny pod numerem my blog.

+0

Szukałem czegoś takiego !, Google + You = Dzięki! –

+0

Sorskoot - Twój wpis na blogu nie jest już dostępny. Czy jest nowy link? – kindohm

+0

Dziękuję .. Zaktualizowałem link ... – Sorskoot

Powiązane problemy