Domanda

C'è un buon modo per associare una proprietà su un valore const in codebehind?

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:

  • fini della localizzazione, stringa di contenuto non deve essere usato per determinare quale elemento è selezionato durante il salvataggio e il caricamento di un ultimo elemento selezionato.
  • Per semplicità, XAML e codice sottostante deve essere collegato identificatore interno (In questo caso, UID). In modo che, XAML e Code-behind possono essere mantenute separatamente.

Tuttavia, la manutenzione-saggio, l'identificatore interno dovrebbe essere definito 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'è alcun modo per collegare ID_foo e ID_bar a UID ComboBoxItem in questo modo:

//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 attuarlo. Sarebbe bello, troppo.

Best,

È stato utile?

Soluzione

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 qui .

Il problema con l'utilizzo di rilegatura è si sta aggiungendo un overhead molto per qualcosa che non cambierà mai. Il legame tenterà di monitorare la vostra proprietà. Inoltre, ci sono noto "fughe" con l'utilizzo di un Binding con una struttura non-dipendenza un oggetto che non implementano INotifyPropertyChanged.

Altri suggerimenti

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

Una volta che questo è in una proprietà, sarà utilizzabile mediante il legame.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top