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
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
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

