2011-03-16 4 views
8

C'è un modo valido per associare una proprietà a un valore const in codebehind?Binding membro const nel codice indietro da xaml in WPF

Quando uso ComboBox, faccio di solito in questo modo in XAML e codice dietro:

XAML:

<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="foo" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="bar" /> 
</ComboBox> 

Codebehind:

ComboBoxItem item = cbBuz.GetSelectedItem(); 
switch (item.Uid) 
{ 
    case "foo": ... break; 
    case "bar": ... break; 
} 

Il motivo per cui ho scelto questo modo è seguente:

  • Per l scopo di ocalizzazione, la stringa di contenuto non deve essere utilizzata per determinare quale elemento è selezionato durante il salvataggio e il caricamento dell'ultimo elemento selezionato.
  • Per semplicità, XAML e code-behind devono essere connessi identificatore interno (In questo caso, Uid). In questo modo, XAML e Code-behind possono essere gestiti separatamente.

Tuttavia, la manutenzione-saggio, l'identificativo interno dovrebbero essere definiti in un posto come questo:

//IDs 
public const string ID_foo = "foo"; 
public const string ID_bar = "bar"; 

... 

// 
switch (item.Uid) 
{ 
    case ID_foo: ... break; 
    case ID_bar: ... break; 
} 

Il problema è apparentemente proprietà non può essere un valore const, quindi non c'è modo di legare ID_foo e ID_bar a UID ComboBoxItem come questo:

//If ID_foo and ID_bar are properties, this will work. 
<ComboBox Name="cbBuz"> 
    <ComboBoxItem Content="foo" Uid="{Binding ID_foo}" IsSelected="true" /> 
    <ComboBoxItem Content="bar" Uid="{Binding ID_bar}" /> 
</ComboBox> 

Quindi, voglio sapere come risolvere questo problema. Oppure, c'è un modo migliore per implementarlo. Sarebbe anche bello.

migliore,

risposta

18

Si sarebbe meglio utilizzare il StaticExtension, in questo modo:

Uid="{x:Static local:YourClass.ID_foo}" 

Dove locale è un alias xmlns per il C# spazio dei nomi della classe. Maggiori informazioni possono essere trovate here.

Il problema con l'utilizzo di Binding è che si aggiungono molte spese generali per qualcosa che non cambierà mai. Il binding tenterà di monitorare la tua proprietà. Inoltre, ci sono known "leaks" con l'utilizzo di un Binding con una proprietà di non dipendenza su un oggetto che non implementa INotifyPropertyChanged.

+0

Grazie mille! Questo è esattamente quello che volevo!Inoltre, le informazioni relative alla perdita e al sovraccarico sono davvero utili. – Aki24x

2

Hai bisogno di fare una proprietà che restituisce la costante (definito in un const), vale a dire:

private const string ID_Foo = "foo"; 
public string FooId 
{ 
    get { return ID_Foo; } 
} 

volta che questo è in una proprietà, sarà utilizzabile via vincolante.

+0

Oh, giusto. C'è un modo per rendere questo più breve? Voglio dire se è C++, possiamo usare #define per fare macro, ma non possiamo. Mi chiedo se IValueConverter ed Enum potrebbero rendere questo più breve quando si aggiunge un nuovo Uid a ComboBox, non in termini di volume di intero codice. – Aki24x

+1

@ Aki24x: è possibile farlo tramite un IValueConverter e specificando un valore in XAML come costante (non tramite associazione). Ciò consentirebbe a un singolo IValueConverter di effettuare una ricerca in qualche modo, ma avresti bisogno di qualcosa per farlo, ovvero: un nome in un dizionario, o usare un enum, o ... –

+0

Vedo. Grazie, Reed. =) – Aki24x