none
Autosuggestbox no muestra la lista de resultados WP8.1 Universal App RRS feed

  • Pregunta

  • Hola,

    Tengo una app que usa MVVMLight y en una de las páginas un control "Autosuggestbox". El tema es que no consigo que muestre la lista ("popup") con los resultados. Bueno, mejor os muestro el código :)

    Aquí la página:

    <AutoSuggestBox x:Name="txtBusqueda" x:Uid="txtBusqueda" 
            ItemsSource="{Binding Lugares}"
            Grid.Row="1" Margin="24 24 24 12" 
            MaxSuggestionListHeight="4" AutoMaximizeSuggestionArea="True" 
            TextMemberPath="Nombre"
        >
        <i:Interaction.Behaviors>
                <core:EventTriggerBehavior EventName="TextChanged">
                    <core:InvokeCommandAction Command="{Binding ChangeTextCommand}" CommandParameter="{Binding Text, ElementName=txtBusqueda}" />
                </core:EventTriggerBehavior>
            </i:Interaction.Behaviors>
            <AutoSuggestBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Nombre}" TextWrapping="Wrap" />
                </DataTemplate>
            </AutoSuggestBox.ItemTemplate>
        </AutoSuggestBox>

    Y aquí el VM:

    private List<LugarInfo> lugares;
    public List<LugarInfo> Lugares
    {
        get { return this.lugares; }
        set
        {
            if (this.lugares == value) return;
            this.lugares = value;
            RaisePropertyChanged(() => Lugares);
        }
    }
    public RelayCommand<string> ChangeTextCommand { get; set; }
    this.ChangeTextCommand = new RelayCommand<string>(async (s) =>
    {
        var result = await Api.GetInfoLugares(texto);
        List<LugarInfo> lugares = new List<LugarInfo>();
        foreach (var lugar in result)
        {
                lugares.Add(new LugarInfo()
                {
                    Id = int.Parse(lugar.Id),
                    Tipo = lugar.Tipo,
                    Nombre = lugar.Nombre
                });
        }
    
        this.Lugares = lugares; // <-- Asignación del itemssource con resultados!
    });


    La propiedad "Lugares" se establece con la lista de valores, pero no se muestran en el control como podéis ver en la imagen. Sólo sale un borde más ancho en la parte inferior del control al establecer dicha propiedad.

    Espero que podáis ayudarme, gracias de antemano.

    Saludos


    jueves, 5 de febrero de 2015 7:00

Respuestas

  • Hola, gracias por las observaciones Christian, pero el problema era que tenía establecido el alto máximo de la lista de sugerencias a un valor demasiado pequeño (lo sé lo sé, es culpa mía ;)), por eso no se mostraba:
    MaxSuggestionListHeight="4"
    Un saludo.
    • Marcado como respuesta Cabuxa.Mapache lunes, 16 de marzo de 2015 8:22
    lunes, 16 de marzo de 2015 8:22

Todas las respuestas

  • Hola Cabuxa.Mapache, primeramente creo que debe agregar el Path en tu AutoSuggestBox.

    <AutoSuggestBox x:Name="txtBusqueda" x:Uid="txtBusqueda" 
            ItemsSource="{Binding Lugares}"
            Grid.Row="1" Margin="24 24 24 12" 
            MaxSuggestionListHeight="4" AutoMaximizeSuggestionArea="True" 
            TextMemberPath="Nombre"
        >
        <i:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="TextChanged">
                <core:InvokeCommandAction Command="{Binding ChangeTextCommand}" CommandParameter="{Binding Path=Text, ElementName=txtBusqueda}" />
            </core:EventTriggerBehavior>
        </i:Interaction.Behaviors>
        <AutoSuggestBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Nombre}" TextWrapping="Wrap" />
            </DataTemplate>
        </AutoSuggestBox.ItemTemplate>
    </AutoSuggestBox>

    Y en el código C# (elimina esa pregunta si el valor es igual al valor actual):

    private ObservableCollection<LugarInfo> lugares;
    public ObservableCollection<LugarInfo> Lugares
    {
        get { return this.lugares; }
        set
        {
            this.lugares = value;
            RaisePropertyChanged(() => Lugares);
        }
    }
    
    public RelayCommand<string> ChangeTextCommand { get; set; }
    this.ChangeTextCommand = new RelayCommand<string>(async (s) =>
    {
        var result = await Api.GetInfoLugares(texto);
        foreach (var lugar in result)
        {
            this.Lugares.Add(new LugarInfo()
            {
                Id = int.Parse(lugar.Id),
                Tipo = lugar.Tipo,
                Nombre = lugar.Nombre
            }); //agrégalo directo al itemssource sin pasar por el atributo.
        }
    });
    ObservableCollection funciona mejor que la lista para MVVM, tal como lo estás necesitando.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    martes, 3 de marzo de 2015 19:03
  • Hola, gracias por las observaciones Christian, pero el problema era que tenía establecido el alto máximo de la lista de sugerencias a un valor demasiado pequeño (lo sé lo sé, es culpa mía ;)), por eso no se mostraba:
    MaxSuggestionListHeight="4"
    Un saludo.
    • Marcado como respuesta Cabuxa.Mapache lunes, 16 de marzo de 2015 8:22
    lunes, 16 de marzo de 2015 8:22