locked
Alterando o SelectedItem de um ListPicker RRS feed

  • Pergunta

  • Pessoal, depois de criar um template para exibir o listpicker, não é mais possível alterar o SelectedItem. Segue o cenário abaixo:

    XAML

                    <toolkit:ListPicker x:Name="lstBancoConta" ExpansionMode="ExpansionAllowed">
                        <toolkit:ListPicker.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <StackPanel Orientation="Horizontal">
                                        <Image x:Name="imgBancoContaLogo" Source="{Binding contaBancoLogoSource}" Width="40" Stretch="Uniform"></Image>
                                        <TextBlock Text="{Binding contaBancoNome}" Margin="10,0,0,0"/>
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </toolkit:ListPicker.ItemTemplate>
                        
                        <toolkit:ListPicker.FullModeItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <StackPanel Orientation="Horizontal">
                                        <Image x:Name="imgBancoContaLogo" Source="{Binding contaBancoLogoSource}" Width="40" Stretch="Uniform"></Image>
                                        <TextBlock Text="{Binding contaBancoNome}" FontSize="36" FontFamily="{StaticResource PhoneFontFamilyLight}" Margin="10,0,0,0"/>
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </toolkit:ListPicker.FullModeItemTemplate>
                    </toolkit:ListPicker>
    

    Note que o ListPicker está preparado para exibir uma imagem e um texto, tanto na lista padrão quanto em FullMode (isto funciona).

    C# para popular o ListPicker

    this.lstBancoConta.ItemsSource = new ListaContaBancaria();

    Classes utilizadas

            public class ListaContaBancaria : List<clsListaContaBancariaBinding>
            {
                public ListaContaBancaria()
                {
                    using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn))
                    {
                        var query = from x in ctx.FOFkContas
                                    where x.CtaStatus == 1
                                    orderby x.CtaBancoNome
                                    select x;
    
                        foreach (var item in query)
                        {
                            Add(new clsListaContaBancariaBinding
                            {
                                contaCodigo = item.CtaCodigo,
                                contaBancoNome = item.CtaBancoNome,
                                contaBancoLogoArquivo = item.CtaBancoLogoSource,
                                contaBancoLogoSource = wp_generic_tools.Image_IO.ImageLoad(item.CtaBancoLogoSource),
                            });
                        }
                    }
                }
            }
    
    
            public class clsListaContaBancariaBinding
            {
                public Int32 contaCodigo { get; set; }
                public String contaBancoNome { get; set; }
                public ImageSource contaBancoLogoSource { get; set; }
                public String contaBancoLogoArquivo { get; set; }
            }
    

    Normalmente o código abaixo funcionaria, mas o valor não é mais válido para o SelectedItem desde que criei o template.

                using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn))
                {
                    var registro = ctx.FOFkLancamentos.FirstOrDefault(l => l.LctNumero == intLancamentoNumero);
    
                    if (registro != null)
                    {
                        // Carrega Conta Bancária se estiver habilitada e cadastrada
                        if (booBancoConta)
                        {
                            if (registro.CtaCodigo != null)
                            {
                                this.lstBancoConta.SelectedItem = registro.FOFkConta.CtaBancoNome;
                            }
                        }
    
                        // Carrega Categoria
                        String strCategoriaDescricao = registro.FOFkCategoriaDespesa.CatDescricao;
                        this.lstCategoria.SelectedItem = strCategoriaDescricao;
    
    
                    }
                }

    Obrigado!

    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo

    domingo, 17 de fevereiro de 2013 02:43

Respostas

  • Acredito que haja uma solução melhor, mas como ninguém postou nada estes dias, preciso dar andamento ao projeto, então lá vai o jeito que consegui:

                using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn))
                {
                    var registro = ctx.FOFkLancamentos.FirstOrDefault(l => l.LctNumero == intLancamentoNumero);
    
                    if (registro != null)
                    {
                        // Carrega Conta Bancária se estiver habilitada e cadastrada
                        if (booBancoConta)
                        {
                            if (registro.CtaCodigo != null)
                            {
    
                                var listaBancos = new ListaContaBancaria();
                                Int32 intIndex = -1;
    
                                foreach (var item in listaBancos)
                                {
                                    intIndex = intIndex + 1;
                                    if (item.contaCodigo == registro.CtaCodigo)
                                    {
                                        this.lstBancoConta.SelectedIndex = intIndex;
                                        break;
                                    }
                                }
                            }
                        }
    Vou marcar como resposta correta, mas se alguem tiver uma solução melhor, por favor poste aqui.

    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo


    segunda-feira, 4 de março de 2013 22:28

Todas as Respostas

  • Acredito que haja uma solução melhor, mas como ninguém postou nada estes dias, preciso dar andamento ao projeto, então lá vai o jeito que consegui:

                using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn))
                {
                    var registro = ctx.FOFkLancamentos.FirstOrDefault(l => l.LctNumero == intLancamentoNumero);
    
                    if (registro != null)
                    {
                        // Carrega Conta Bancária se estiver habilitada e cadastrada
                        if (booBancoConta)
                        {
                            if (registro.CtaCodigo != null)
                            {
    
                                var listaBancos = new ListaContaBancaria();
                                Int32 intIndex = -1;
    
                                foreach (var item in listaBancos)
                                {
                                    intIndex = intIndex + 1;
                                    if (item.contaCodigo == registro.CtaCodigo)
                                    {
                                        this.lstBancoConta.SelectedIndex = intIndex;
                                        break;
                                    }
                                }
                            }
                        }
    Vou marcar como resposta correta, mas se alguem tiver uma solução melhor, por favor poste aqui.

    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo


    segunda-feira, 4 de março de 2013 22:28
  • Achar a solução sozinho também é uma forma de "marcar como resposta"! ;)

    Caso mais alguem venha contribuir, analisamos novamente.

    Bom trabalho Andrey!

    Att,

    Felipo Gonçalves
    Microsoft Contingent Staff

    quarta-feira, 6 de março de 2013 13:10