2013-01-11 9 views
26

uczę WPF i I napotkał następujący problem:Jak mogę używać typów enum w XAML?

mam typu enum w innej przestrzeni nazw niż mój XAML:

public enum NodeType 
    { 
     Type_SYSTEM = 1,    // System 
     Type_DB = 2,     // Database 
     Type_ROOT = 512,    // Root folder 
     Type_FOLDER = 1024,   // Folder 
    } 

w moim XAML Chciałbym wywołać obrazu z integer

<Image.Style> 
    <Style TargetType="{x:Type Image}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Type}" Value="{NodeType: }"> 
       <Setter Property="Source" Value="/Images/DB.PNG"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Type}" Value="128"> 
       <Setter Property="Source" Value="/Images/SERVER.PNG"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Image.Style> 

Czy istnieje sposób na uzyskanie wartości całkowitej i porównanie jej z typem wyliczenia bezpośrednio w kodzie XAML?

Moje enum jest w przestrzeni nazw AnotherNamespace.Types

<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB"> 
             <Setter Property="Source" Value="/Images/SERVER.PNG"/> 

Odpowiedz

39

miałem podobne pytanie here, a mój wynik końcowy był stworzyć ogólny IValueConverter która przeszła wartość enum chciałem dopasować się jako ConverterParameter i zwraca true lub false w zależności od tego, czy powiązana wartość jest zgodna z wartością Enum z wartości (int).

Efekt końcowy wygląda tak:

Kod XAML:

<DataTrigger Value="True" 
      Binding="{Binding SomeIntValue, 
       Converter={StaticResource IsIntEqualEnumConverter}, 
       ConverterParameter={x:Static local:NodeType.Type_DB}}"> 

Converter

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (parameter == null || value == null) return false; 

    if (parameter.GetType().IsEnum && value is int) 
    { 
     return (int)parameter == (int)value; 
    } 
    return false; 
} 
+0

Dzięki za odpowiedź! Jeśli mój "NodeType" znajduje się w innym obszarze nazw, jak mogę zaimportować do xaml? – davymartu

+0

@ user1696549 Możesz dodać inne przestrzenie nazw do swojego XAML, używając 'xmlns' w tagu głównym. Na przykład ta linia doda przestrzeń nazw 'MyNamespace' z zespołu' MyAssembly' do pliku XAML i może się do niej odwoływać przedrostek '" local "': 'xmlns: local =" clr-namespace: MyAssembley.MyNamespace ; assembly = MyAssembly "' – Rachel

+0

Z powodzeniem zaimportowałem przestrzeń nazw, ale xaml mówi mi, że "NodeType" nie istnieje w przestrzeni nazw ... moja przestrzeń nazw to "XFramework.domain.helpers", a moje wyliczenie jest w klasie XHelper w ta sama przestrzeń nazw. – davymartu

8

Musisz tylko upewnić się, że przestrzeń nazw jest rozliczana-w nagłówku XAML wtedy możesz odwoływać się zarówno do niestandardowych DP, jak i wartości wyliczeniowych bezpośrednio w swoim znaczniku.

Na przykład używam tego kodu, aby zrobić tylko, że:

<DataTemplate.Triggers> 
    <MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" /> 
     <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" /> 
    </MultiDataTrigger.Conditions> 
    <MultiDataTrigger.Setters> 
     <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" /> 
    </MultiDataTrigger.Setters> 
    </MultiDataTrigger> 
</DataTemplate.Triggers> 

Należy pamiętać, że nie można uzyskać dostępu DataTriggers w stylu, trzeba zamiast zrobić DataTemplate lub ControlTemplate na to (jednak .NET 4 dodaje możliwość ustawiania wyzwalaczy w stylach). Można zastąpić ControlTemplate ze stylu tak:

<Style x:Key="MyCustomButtonStyle" TargetType="Button"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
     <ContentPresenter /> 
     <ControlTemplate.Triggers> 
      <!-- Put your DataTriggers here --> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Dla DataTemplates chcesz mieć powiązań do obiektu, można po prostu użyć do ContentPresenter i ustawić jego zawartość do obiektu, który ma być wyświetlany wraz z DataTemplate definicja używana do wyświetlania obiektu. Zawsze istnieje sposób na użycie DataTrigger, ale nie zawsze jest on bezpośredni lub tak prosty jak użycie Stylu.

+1

Tak, możesz porównać Enum do Enum w XAML, tak jak tu pokazujesz, ale to pytanie dotyczy porównywania Enum do Integer, którego nie możesz zrobić tak daleko, jak to tylko możliwe bez konwertera lub niestandardowego zachowania. Tak, możesz umieścić Triggery w stylu, jak OP zademonstrował w przykładowym kodzie pytania :) – Rachel

+0

Nie mam reputacji, aby edytować tytuł pytania, ale twierdzę, że tytuł wprowadza w błąd: "Jak czy mogę używać typów wyliczeniowych w XAML? " nie mówi nic o liczbach całkowitych i całkowitym porównaniu, tytuł byłby bardziej wyraźny: "Jak porównać enum do liczby całkowitej w XAML?" Ponadto nie można umieścić DataTrigger w elemencie stylu, normalne wyzwalacze nie mogą testować powiązań. – tpartee

+0

Ważne jest, aby przeczytać całe pytanie, a nie tytuł. Naprawdę nie chcę wprowadzać zmian, ponieważ jest to stare pytanie, które trafiłoby na szczyt, ale gdyby to było nowsze pytanie, zrobiłbym to. :) Być może nie rozumiem co mówisz, ale jestem dość pozytywny, możesz umieścić DataTriggers w Style.Triggers. Ciągle to robię. – Rachel

Powiązane problemy