2009-11-06 15 views
9

Mam ListBox przedstawiający dane o pracownikach, takie jak imię i nazwisko, zdjęcie w dziale, numer identyfikacyjny itp. Pracownicy mogą mieć różne typy, takie jak Manager, Staff, Volunteers. Mam 3 osobne szablony danych - po jednym dla każdego typu. Wszystkie te szablony pokazują zasadniczo te same dane, ale prezentowane w różny sposób.WPF - Parametry do DataTemplates?

W zależności od użytkownika zalogowanego na zdjęciach aplikacji, numerze identyfikacyjnym itp. Może być widoczny lub nie. Mam więc do tego właściwości boolowskie - CanSeePhotos, CanSeeBadgeNumbers itp. Więc jeśli CanSeePhotos == false, wszystkie szablony danych powinny ukrywać zdjęcia.

Moje pytanie brzmi: jak mogę użyć tych właściwości boolowskich w szablonach danych, aby przełączyć widoczność odpowiednich elementów? Czy istnieje sposób przekazywania parametrów do szablonów danych, ponieważ zwracam je z szablonu TemplateSelector?

Dzięki!

edit: następstwie pomysł Ray skończyło się w ten sposób:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}" 

Odpowiedz

4

Faktycznie istnieje sposób, aby dostosować DataTemplates są one zwracane z TemplateSelector owijając je wewnątrz FrameworkElementFactory, ale to jest zbyt skomplikowane dla twoich potrzeb.

W Twoim przypadku są dwa rozwiązania, które są znacznie łatwiejsze: wyzwalacze i konwertery.

wyzwalacze

Można użyć spust wewnątrz DataTemplate. Na przykład nadaj polu tekstowemu lub panelowi, w którym wyświetlany jest numer znaczka, wartość x: Nazwa, a następnie utwórz parametr DataTrigger we właściwości CanSeeBadgeNumebers. Dodaj jednego ustawiającego do DataTrigger i ustaw właściwość Visible na Hidden lub Collapsed, odwołując się do nazwy.

podstawowa idea:

<DataTemplate> 
    ... 
    <DockPanel x:Name="BadgeNumberPanel"> 
    <Label ... /> 
    <TextBox ... /> 
    </DockPanel> 
    ... 

    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true"> 
     <Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Konwertery

Można utworzyć IValueConverter w kodzie, który przekształca „bool” typ na „Widoczność” typ (istnieje wiele przykładów tam można wyciąć i wklej), a następnie połącz wizualizację TextBox z CanSeeBadgeNumbers, używając konwertera.

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

jak to zrobić

I rzeczywiście użyć innej techniki dla własnego kodu: Moja fundacja danych zawiera MarkupExtension pisałem, że wywołuje mój rdzeń C# wyrażenie parser, więc mogę powiedzieć coś takiego

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

Niestety moja baza danych nie została jeszcze wydana. Kiedy to jest, planuję zrobić to za darmo i open source, ale to jeszcze kilka miesięcy.

+1

Jeśli Twój numer CanSeeBadgeNumber nie jest własnością danych, ale środowiska, być może będziesz musiał dodać coś takiego jak Source = "{x: Static UserInfo.CurrentUser}" do powiązania. To samo dotyczy użycia wyzwalaczy lub konwerterów. –

+1

Wyrażenia w powiązaniach XAML! Czekałem na to od dawna - naprawdę tęsknię za tym z moich dni Flex. Czekamy na to! – Grokys

+4

Czy kiedykolwiek go wypuściłeś? – BrainSlugs83

Powiązane problemy