PDA

View Full Version : [WPF] Eseguire il BIND di un Enumerativo in una Combobox


robertino_salemi
19-02-2015, 18:06
Hi,

I have this enum type:

public enum SchedActiveEnum
{
[Description("All")]
All,
[Description("Y")]
Y,
[Description("N")]
N
}


Qual è il modo migliore per eseguire il bind in una combobox?

Vorrei visualizzare la description ma ricevere il valore.

Grazie.

robertino_salemi
20-02-2015, 16:03
Risolto tramite l'utilizzo di un dizionario:


private Dictionary<Definition.SchedActiveEnum, string> _schedActive;

public Dictionary<Definition.SchedActiveEnum, string> SchedActive
{
get
{
if (_schedActive == null)
{
_schedActive = new Dictionary<Definition.SchedActiveEnum, string>();
var myList = Enum.GetValues(typeof(Definition.SchedActiveEnum)).Cast<Enum>().Select(value => new
{
value,
(Attribute.GetCustomAttribute(
value.GetType().GetField(value.ToString()),
typeof(DescriptionAttribute)) as DescriptionAttribute).Description
}
);

foreach (var item in myList)
{
_schedActive.Add((Definition.SchedActiveEnum)item.value, item.Description);
}
}
return _schedActive;
}
}


nello xaml ho eseguito il Bind:

<ComboBox Name="cmbActive"
DataContext="{StaticResource DomainDataViewModel}"
ItemsSource="{Binding SchedActive}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
Width="50">

dove DataContext è il mio ViewModel.

L'unico problema: dalla cambo ricevo il valore della Description e non la Key del dizionario, come mai?

Grazie.

msangi
22-02-2015, 15:17
Anziché usare un dizionario, prova a dare un'occhiata ai ValueConverter. Fanno esattamente quello che serve a te, permettendoti di passare alla ComboBox l'oggetto che del tuo dominio e di avere un metodo per effettuare la conversione nella sua rappresentazione testuale.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/43db6b07-f886-4214-8076-5a5ec2360616/valueconverter-that-converts-an-enum-value-to-its-corresponding-string-value?forum=wpf

robertino_salemi
23-02-2015, 10:10
Anziché usare un dizionario, prova a dare un'occhiata ai ValueConverter. Fanno esattamente quello che serve a te, permettendoti di passare alla ComboBox l'oggetto che del tuo dominio e di avere un metodo per effettuare la conversione nella sua rappresentazione testuale.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/43db6b07-f886-4214-8076-5a5ec2360616/valueconverter-that-converts-an-enum-value-to-its-corresponding-string-value?forum=wpf

Effettivamente avevo pensato a questa soluzione, poi però ho risolto sempre con il dizionario:


private Dictionary<Definition.SchedActiveEnum, string> _schedActive;

public Dictionary<Definition.SchedActiveEnum, string> SchedActive
{
get
{
if (_schedActive == null)
{
_schedActive = new Dictionary<Definition.SchedActiveEnum, string>();

//Permette di visualizzare la Description dell'Enum
var myList = Enum.GetValues(typeof(Definition.SchedActiveEnum)).Cast<Enum>().Select(value => new
{
value,
(Attribute.GetCustomAttribute(
value.GetType().GetField(value.ToString()),
typeof(DescriptionAttribute)) as DescriptionAttribute).Description
}
);

foreach (var item in myList)
{
_schedActive.Add((Definition.SchedActiveEnum)item.value, item.Description);
}

}
return _schedActive;
}
}


nello xaml:


<ComboBox Name="cmbActive"
DataContext="{StaticResource DomainDataViewModel}"
ItemsSource="{Binding SchedActive}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
Width="50">
</ComboBox>


Grazie.