Establecer el valor de un combobox con DataTemplate desde otra ventana (WPF, C# y EF)

Unanswered Establecer el valor de un combobox con DataTemplate desde otra ventana (WPF, C# y EF)

  • jueves, 03 de mayo de 2012 14:29
     
     

    Buenos días, tuve la necesidad de pasar valores a un combobox y un textbox desde una ventana hija el amigo David Gonzáles me aclaro como hacerlo y me parece que estuvo muy bien su colaboración. lo entendi.

    Pero esto me genero otra duda y es el eslabón que me falta, la pregunta deriva por que el textbox me lo llena perfectamente pero el combobox no y es por que el combobox lo lleno con un DataTemplate pero no se como establecerle el valor. Aquí dejo el link que detalla mejor el problema que tengo.

    Desde ya muchas gracias por su ayuda.

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/dfa729d2-93ed-48a0-87dd-12741221eea7/

      

    C. Zapata

Todas las respuestas

  • jueves, 03 de mayo de 2012 16:16
     
      Tiene código

    Hola :)

    Pues me parece muy Windows Forms la respuesta que te voy a proponer... Pero se me ocurre que implementes una interfaz con un metodo que informe a la ventana "padre" de su cambio... en una ocasión escribi al respecto en mi blog

    El codigo de la interfaz iria de la forma:

    public interface IContratoDosVentanas
    {
            void CambiarItemSource(List<Persona> personas);
    }

    La implementacion en la ventana Padre:

    public partial class MainWindow : Window, IContratoDosVentanas
        {
            public MainWindow()
            {
                InitializeComponent();
                Loaded += MainWindowLoaded;
            }
    
            private void MainWindowLoaded(object sender, RoutedEventArgs e)
            {
                Window1 w = new Window1();
                w.Owner = this;
                w.Show();
            }
    
            public void CambiarItemSource(List<Persona> personas)
            {
                cbxUno.ItemsSource = personas;
            }
        }

    En el evento click de un boton en la ventana hija:

    public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                IContratoDosVentanas iContratoDosVentanas = Owner as IContratoDosVentanas;
                if (iContratoDosVentanas != null)
                    iContratoDosVentanas.CambiarItemSource(new List<Persona>
                                                               {
                                                                   new Persona
                                                                       {
                                                                           Id = 1,
                                                                           Nombre = "Juan",
                                                                           Apellido = "Perez"
                                                                       }
                                                               }
                        );
                Close();
            }
        }

    El XAML de la ventana padre:

    <ComboBox x:Name="cbxUno">  
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Nombre}"></TextBlock>                        
                            <TextBlock Text="{Binding Apellido}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>

    Espero te sea de utilidad

    Saludos.


    Nicolás Herrera
    Bogotá - Colombia
    BLOG - Leader Group BogotaDotNet
    "Daría todo lo que sé, por la mitad de lo que ignoro." Rene Descartes

  • domingo, 06 de mayo de 2012 11:31
     
      Tiene código

    Hola CAZA.

    Respondo en este hilo ya que el otro esta cerrado.

    segun lo ultimo que comentas, para personalizar el resultado de la plantilla lo mejor es que controles el binding, y para ello tienes que crear un conversor, te voy a poner un ejemplo sencillo para que veas la flexibilidad que tienen los conversores en los bindings:

    codigo xaml:

        <Window.Resources>
            <my:ComboTextConverter x:Key="ComboTextConverter" />
        </Window.Resources>
        
        <StackPanel>
            <ComboBox Height="23" HorizontalAlignment="Left" Name="cmb_lin" VerticalAlignment="Top" Width="120" Grid.Row="1">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Converter={StaticResource ComboTextConverter}, ConverterParameter=co_lin}" Width="100" />
                            <TextBlock Text="{Binding Converter={StaticResource ComboTextConverter}, ConverterParameter=lin_des}" Width="200" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </StackPanel>

    He modificado los binding para que se enlace todo el objeto 'clin_art', de modo que puedas modificar cada una de sus propiedades para la plantilla segun te parezca mejor.

    Ademas he añadido un conversor y  un parametro para cada elemento de la plantilla, para poder actuar en consecuencia en el conversor.

    El codigo del conversor es sencillo:

        /// <summary>
        /// Clase conversora para establecer texto personalizado en un combo
        /// </summary>
        public class ComboTextConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                // si no hay parametro no hacer nada
                if (null == parameter) return value;
                
                // evaluar el parametro
                switch ((string)parameter)
                {
                    // si es co_lin, retornarlo
                    case "co_lin":
                        // retornar el valor solo de colin
                        return ((clin_art)value).co_lin;
    
                    // si es 'lin_des', retornar cadena vacia para que no se muestre
                    case "lin_des":
                        // retornar cadena vacia para que no se muestre
                        return string.Empty;
    
                    // por defecto retornar el valor entrante
                    default:
                        return value;
                }
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                // no hace falta implementar en este caso
                throw new NotImplementedException();
            }
        }

    Esto lo he puesto como un ejemplo, pero deberas hacer lo que mejor te parezca a ti. En este caso no enlazo la propiedad 'lin_des', de modo que no sera vista en el combo.

    De esta forma se puede personalizar completamente el enlace con la plantilla, mostrando o quitando datos.

    Si tienes algun problema comentalo.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

  • domingo, 06 de mayo de 2012 21:32
     
     

    Hola David Gracias voy a probar tu solución, me parece un buen ejemplo el que me diste acá.

    Disculpa tanta cosa es que en verdad me falta todavía por aprender muchas de estas cosas, el camino es largo pero con la ayuda de personas como tu he tenido la buena dicha de continuar adelante.

    Pruebo y te aviso.  


    C. Zapata