2011-03-16 13 views
8

¿Hay alguna buena manera de vincular una propiedad a un valor constante en codebehind?Enlace const miembro en el código detrás de xaml en WPF

Cuando uso ComboBox, que suele hacer de esta manera en XAML y código detrás:

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

La razón por la que elegí esta manera es siguiente:

  • Para l propósito de localización, la cadena de contenido no debe usarse para determinar qué elemento se selecciona durante el guardado y la carga del último elemento seleccionado.
  • Para simplificar, XAML y código subyacente deben estar conectados como identificador interno (en este caso, Uid). Entonces, XAML y Code-behind pueden mantenerse por separado.

Sin embargo, el mantenimiento a gota, el identificador interno debe definirse en un lugar como este:

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

... 

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

El problema es aparentemente propiedad no puede ser de valor constante, así que no hay forma de obligar ID_foo y ID_bar a UID del ComboBoxItem así:

//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> 

Por lo tanto, quiero saber cómo resolver este problema. O, ¿hay alguna forma mejor de implementarlo? Sería bueno, también.

mejor,

Respuesta

18

Usted sería mejor usar el StaticExtension, así:

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

Dónde local es un alias xmlns para el C# espacio de nombres de la clase. Se puede encontrar más información en here.

El problema con el uso de Encuadernación es que está agregando mucho sobrecarga para algo que nunca cambiará. El enlace intentará controlar su propiedad. Además, hay known "leaks" con el uso de un enlace con una propiedad de no dependencia en un objeto que no implementa INotifyPropertyChanged.

+0

¡Muchas gracias! Esto es exactamente lo que quería!Además, la información relacionada con fugas y gastos generales es realmente útil. – Aki24x

2

Usted necesita hacer una propiedad que devuelve la constante (que se define en un const), es decir:

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

Una vez que esto está en una propiedad, será utilizable a través de la unión.

+0

Oh, eso es correcto. ¿Hay alguna manera de hacer esto más corto? Quiero decir si es C++, podemos usar #define para hacer macro, pero no podemos. Me pregunto si IValueConverter y Enum podrían hacerlo más corto al agregar un nuevo Uid a ComboBox, no en términos de un volumen de código completo. – Aki24x

+1

@ Aki24x: Podría hacer esto a través de un IValueConverter y especificar un valor en XAML como una constante (no a través de enlace), en su lugar. Eso permitiría que un solo IValueConverter hiciera una búsqueda de alguna manera, pero necesitarías algo para buscar, es decir: un nombre en un diccionario, o usar una enumeración, o ... –

+0

Ya veo. Gracias, Reed. =) – Aki24x

Cuestiones relacionadas