2015-08-12 6 views
18

Un'app a cui sto lavorando richiede che ConverterParameter sia un enum. Per questo, la strada normale da fare sarebbe:x: Statico in UWP XAML

{Binding whatever, 
    Converter={StaticResource converterName}, 
    ConverterParameter={x:Static namespace:Enum.Value}} 

Tuttavia, la piattaforma di UWP x: namespace non sembra avere l'estensione statico.

Qualcuno sa se esiste una soluzione che non si basa su x: statico per confrontare un enum nel binding?

+0

non ho fatto alcun UWP, così ho don lo so, ma c'è [questo articolo] (http://www.codeproject.com/Articles/305932/Static-and-Type-markup-extensions -per-Silverlight) che spiega come creare un'estensione di markup per Silverlight (che non ha anche 'x: Static'). Si può applicare qui – Jcl

+0

Ecco [risposta] (http://stackoverflow.com/a/360639/1526778) sull'utilizzo di enum in xaml che deve funzionare –

risposta

32

Questo funziona per me in una UWP:

<Button Command="{Binding CheckWeatherCommand}"> 
    <Button.CommandParameter> 
    <local:WeatherEnum>Cold</local:WeatherEnum> 
    <Button.CommandParameter> 
</Button> 
+1

Wow, questo deve essere aumentato di più. Funziona perfettamente, non sono necessari workaround con le classi e cosa no. –

+2

C'è un modo per specificare questo in linea tramite 'CommandParameter = ...', per evitare l'xaml nel corpo del pulsante? – Felix

+2

@Felix Sembra funzionare bene dichiarando il tipo come una risorsa. Cold quindi fa riferimento ovunque CommandParameter = {StaticResource Cold}. Non pulito come x: statico e in linea ma salva ogni volta l'aggiunta di wrapper XAML. –

6

Non esiste alcuna estensione di markup statico su UWP (e anche sulla piattaforma WinRT).

Una delle possibili soluzioni è creare una classe con valori enum come proprietà e archiviare l'istanza di questa classe in ResourceDictionary.

Esempio:

public enum Weather 
{ 
    Cold, 
    Hot 
} 

Ecco la nostra classe con valori enum:

public class WeatherEnumValues 
{ 
    public static Weather Cold 
    { 
     get 
     { 
      return Weather.Cold; 
     } 
    } 

    public static Weather Hot 
    { 
     get 
     { 
      return Weather.Hot; 
     } 
    } 
} 

Nel vostro ResourceDictionary:

<local:WeatherEnumValues x:Key="WeatherEnumValues" /> 

Ed eccoci qui:

"{Binding whatever, Converter={StaticResource converterName}, 
ConverterParameter={Binding Hot, Source={StaticResource WeatherEnumValues}}}" /> 
4

Il modo più conciso che io conosca ...

public enum WeatherEnum 
{ 
    Cold, 
    Hot 
} 

definire il valore enum in XAML:

<local:WeatherEnum x:Key="WeatherEnumValueCold">Cold</local:WeatherEnum> 

E semplicemente lo usano:

"{Binding whatever, Converter={StaticResource converterName}, 
ConverterParameter={StaticResource WeatherEnumValueCold}}" 
+0

Questo non funziona per me ... Ho provato come suggerito, ma in fase di esecuzione ottengo questo errore: il TypeConverter per "Phase" non supporta la conversione da una stringa. (La fase è il mio enumeratore) –

0

questa è una risposta utilizzando le risorse e senza convertitori:

Vista:

<Page 
..... 
xmlns:local="using:EnumNamespace" 
..... 
> 
    <Grid> 
    <Grid.Resources> 
     <local:EnumType x:Key="EnumNamedConstantKey">EnumNamedConstant</local:SettingsCats> 
    </Grid.Resources> 

    <Button Content="DoSomething" Command="{Binding DoSomethingCommand}" CommandParameter="{StaticResource EnumNamedConstantKey}" /> 
    </Grid> 
</Page> 

ViewModel

public RelayCommand<EnumType> DoSomethingCommand { get; } 

    public SomeViewModel() 
    { 
     DoSomethingCommand = new RelayCommand<EnumType>(DoSomethingCommandAction); 
    } 

    private void DoSomethingCommandAction(EnumType _enumNameConstant) 
    { 
    // Logic 
    ......................... 
    }