Pregunta

¿Hay alguna buena manera de vincular una propiedad a un valor const en CodeBehind?

Cuando uso Combobox, generalmente hago 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>

Código detrás:

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

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

  • Para fines de localización, la cadena de contenido no debe usarse para determinar qué elemento se selecciona durante el guardado y la carga de un último elemento seleccionado.
  • Por simplicidad, XAML y Code-Behind deben estar conectados Identificador interno (en este caso, UID). Para que XAML y Code-Behind puedan mantenerse por separado.

Sin embargo, en cuanto al mantenimiento, 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 la propiedad no puede ser un valor const, por lo que no hay forma de vincular ID_FOO e ID_BAR a UID de ComboBoxItem como este:

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

Entonces, quiero saber cómo resolver este problema. O bien, ¿hay una mejor manera de implementarlo? También sería bueno.

Mejor,

¿Fue útil?

Solución

Estarías mejor usando el StaticExtension, al igual que:

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

Donde el local es un alias XMLNS para el espacio de nombres C# de su clase. Se puede encontrar más información aquí.

El problema con el uso de la vinculación es que está agregando muchas sobrecargas para algo que nunca cambiará. La vinculación intentará monitorear su propiedad. También hay "Fugas" conocidas con el uso de un enlace con una propiedad de no dependencia en un objeto que no implementa inotifypropertychanged.

Otros consejos

Debe hacer una propiedad que devuelva la constante (definida 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, se puede utilizar a través de la vinculación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top