Question

Y at-il un bon moyen de lier une propriété à une valeur de const dans codebehind?

Quand j'utilise ComboBox, je le fais habituellement de cette façon en XAML et le code derrière:

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 raison pour laquelle j'ai choisi cette façon est le suivant:

  • Pour des raisons de localisation, chaîne de contenu ne doit pas être utilisé pour déterminer quel élément est sélectionné lors de la sauvegarde et le chargement d'un dernier élément sélectionné.
  • Pour simplifier, XAML et code-behind doit être connecté identifiant interne (Dans ce cas, uid). Alors que, XAML et le code-behind peuvent être conservés séparément.

Cependant, sage-entretien, l'identifiant interne doit être défini dans un lieu comme celui-ci:

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

...

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

Le problème est apparemment la propriété ne peut pas être une valeur const, donc il n'y a aucun moyen de lier ID_foo et ID_bar à uid ComboBoxItem comme ceci:

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

Alors, je veux savoir comment résoudre ce problème. Ou, est-il un moyen de mieux mettre en œuvre. Ce serait bien aussi.

Best,

Était-ce utile?

La solution

Vous serait mieux d'utiliser le StaticExtension , comme ceci:

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

Si locale est un alias xmlns pour l'espace de noms C # de votre classe. Plus d'informations peuvent être trouvées .

Le problème avec l'utilisation de liaison est vous ajoutez une surcharge de beaucoup pour quelque chose qui ne changera jamais. La liaison tentera de surveiller votre propriété. En outre, il y a connu « fuites » à l'aide d'une liaison avec une propriété non-dépendance à l'égard d'un objet qui ne mettent pas en œuvre INotifyPropertyChanged.

Autres conseils

Vous devez faire une propriété qui retourne la constante (définie dans un const), à savoir:

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

Une fois que cela est dans une propriété, il sera utilisable par liaison.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top