none
No muestra los datos en Combobox Silverlight 5 prime RRS feed

  • Pregunta

  • Tengo el siguiente código para seleccionar un dato, se realizó un enumerado para que se tome el dato que se necesita.

    El enumerado esta en la capa de modelo de este modo:

     public enum TipoPPA 
        {
            [Description("SRT")]
            SRT=1,
            [Description("Conexión")]
            Conexion=2,
            [Description("Ejecutor")]
            Ejecutor=1
        }


    En la Clase ViewModel ( se está llevando MVVM) se tiene la propiedad y el campo privado de la siguiente forma

    private TipoPPA TipoPpa; //<=== campo privado
    
           public TipoPPA Tipoppa //<=== Propiedad
            {
                get
                {
                    return TipoPpa;
                }
                set
                {
                    TipoPpa = value;
                    this.RaisePropertyChanged(() => this.Tipoppa);
                }
            }


    En EL xaml de la vista se tiene asi:

    <ComboBox Name="ComboTipoPpa" Grid.Row="10" Grid.Column="1"
                     Height="26" Width="177" 
                     HorizontalAlignment="Left" 
                     Margin="10,1,0,1"
                     IsEnabled="{Binding ElementName=cbAgregarManual, Path=IsChecked}" 
                     DisplayMemberPath="Nombre" 
                     SelectedItem="{Binding Path=Tipoppa, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, 
                Converter={StaticResource EnumToIntConverter}}" DataContext="{Binding}"
                     ItemsSource="{Binding Path=Tipoppa, Mode=OneTime, Converter={StaticResource EnumToIEnumerableConverter}}"/>

    Pero no se muestra los datos del enumerado como muestro en la imagen;

    ademas no se si en el XAML toma el valor según se seleccione del Enumerado.

    Cualquier ayuda les agradezco!! ;) :D

    PD: no conozco bien WPF ni silverlight soy novato en esa tecnología



    • Editado greg_dorian martes, 10 de diciembre de 2019 12:42
    lunes, 9 de diciembre de 2019 22:01

Respuestas

  • hola

    >>El conversor devuelve un error, este es el error que me sale en el conversor..

    si asignas una lista tiene que quitar el converter

    ItemsSource="{Binding Path=ListTipoPpa}"

    recuerda en el viewmodel asignar los items que quieres listar

     Explain Combo Box Binding In MVVM - WPF

    solo tienes que crear una lista que sea ObservableCollection<> indicando las propiedades

    <ComboBox HorizontalAlignment="Left"   
                      Margin="183,39,0,0"   
                      VerticalAlignment="Top"   
                      Width="120"   
                      ItemsSource="{Binding Path=Persons}"    
                      SelectedItem="{Binding Path=SPerson}"  
                      DisplayMemberPath="Name"/> 
    como se ven en el ejemplo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta greg_dorian miércoles, 11 de diciembre de 2019 16:59
    martes, 10 de diciembre de 2019 19:04

Todas las respuestas

  • hola

    Pero donde defines la lista de items ? alli veo que usas

     ItemsSource="{Binding Path=Tipoppa,

    pero eso no es una lista

    Quizas tenga algo que ver el EnumToIEnumerableConverter, pero estas seguro que crea la lista de items ?

    Que pasa si generas una List<> simple como propiedad del ViewModel y le pones valores? los visualizas listados

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de diciembre de 2019 22:59
  • hola

    Pero donde defines la lista de items ? alli veo que usas

     ItemsSource="{Binding Path=Tipoppa,

    pero eso no es una lista

    Quizas tenga algo que ver el EnumToIEnumerableConverter, pero estas seguro que crea la lista de items ?

    Que pasa si generas una List<> simple como propiedad del ViewModel y le pones valores? los visualizas listados


    HOLA Leandro

    No he trabajado nunca con mvvm ni silverlight me gustaría saber donde defino la lista de items? ya he corrido con paso a paso pero si me trae el enumerado. 

    como indica la imagen si selecciona y trae valores de enumerado.

    Gracias por las respuestas!! :) :D :)

    UPDATE:

    el EnumToIEnumerableConverter es una clase creada en la capa helpers

        public class EnumToIEnumerableConverter : IValueConverter
        {
            private Dictionary<Type, List<object>> cache = new Dictionary<Type, List<object>>();
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var type = value.GetType();
                if (!this.cache.ContainsKey(type))
                {
                    var fields = type.GetFields().Where(field => field.IsLiteral);
                    var values = new List<object>();
                    if ((int)fields.ElementAt(0).GetRawConstantValue() > 0)
                    {
                        values.Add(null); 
                    }
                    foreach (var field in fields)
                    {
                        DescriptionAttribute[] a = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);
                        if (a != null && a.Length > 0)
                            values.Add(a[0].Description);
                        else
                            values.Add(field.GetValue(value));
                    }
                    this.cache[type] = values;
                }
    
                return this.cache[type];
            }

    • Editado greg_dorian martes, 10 de diciembre de 2019 12:19
    martes, 10 de diciembre de 2019 12:07
  • hola

    Asi como defines la propiedad Tipoppa del tipo TipoPPA podrias definir una que sea

    List<NombreClass> ListTipoPPA

    Y esa la usa en el ItemsSource, al menos para ver si ese conversor de enum es el problema

    Cuando use NombreClass hacia referencia a que definas una clase con al menos dos propiedades una de id y otra de descripcion para indicar el value y display del combo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 10 de diciembre de 2019 13:00

  • List<NombreClass> ListTipoPPA

    Y esa la usa en el ItemsSource, al menos para ver si ese conversor de enum es el problema

    Cuando use NombreClass hacia referencia a que definas una clase con al menos dos propiedades una de id y otra de descripcion para indicar el value y display del combo

    hola leandro

    Gracias efectivamente el conversor de enum es el problema, este es el código que adicione

      private List<TipoPpaTO> ListTipoPPA; <== private field
       public List<TipoPpaTO> ListTipoPpa
       {
            get
            {
                return ListTipoPPA;
            }
            set
            {
                if (ListTipoPPA != value)
                {
                    ListTipoPPA = value;
                    this.RaisePropertyChanged(() => this.ListTipoPpa);
                }
            }
       }
       /// a transfer object
       public class TipoPpaTO
       {
           public int IdPPA { get; set; }
           public TipoPPA Nombre { get; set; }
       }

    y en XAML

    <ComboBox Name="ComboTipoPpa" Grid.Row="10" Grid.Column="1"
                      Height="26" Width="177" 
                      HorizontalAlignment="Left" 
                      Margin="10,1,0,1"
                      IsEnabled="{Binding ElementName=cbAgregarManual, Path=IsChecked}" 
                      SelectedItem="{Binding Path=Tipoppa, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, Converter={StaticResource EnumToIntConverter}}"
                      ItemsSource="{Binding Path=ListTipoPpa, Converter={StaticResource EnumToIEnumerableConverter}}"/>

    Como me indicaste, ceo que es lo que me querías sugerir?

    Y EFECTIVAMENTE El conversor devuelve un error, este es el error que me sale en el conversor...

    martes, 10 de diciembre de 2019 18:45
  • hola

    >>El conversor devuelve un error, este es el error que me sale en el conversor..

    si asignas una lista tiene que quitar el converter

    ItemsSource="{Binding Path=ListTipoPpa}"

    recuerda en el viewmodel asignar los items que quieres listar

     Explain Combo Box Binding In MVVM - WPF

    solo tienes que crear una lista que sea ObservableCollection<> indicando las propiedades

    <ComboBox HorizontalAlignment="Left"   
                      Margin="183,39,0,0"   
                      VerticalAlignment="Top"   
                      Width="120"   
                      ItemsSource="{Binding Path=Persons}"    
                      SelectedItem="{Binding Path=SPerson}"  
                      DisplayMemberPath="Name"/> 
    como se ven en el ejemplo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta greg_dorian miércoles, 11 de diciembre de 2019 16:59
    martes, 10 de diciembre de 2019 19:04