Reliure membre const dans le code derrière de XAML dans WPF
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,
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.