Foros del Web » Programación para mayores de 30 ;) » .NET »

Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el elemento.

Estas en el tema de Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el elemento. en el foro de .NET en Foros del Web. Hola a todos los Foreros del mundo.. Estoy desesperado, por que no sé como solucionar este problema, no veo luz por ningún lado... Vereis, tengo ...
  #1 (permalink)  
Antiguo 14/06/2012, 05:39
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el elemento.

Hola a todos los Foreros del mundo..

Estoy desesperado, por que no sé como solucionar este problema, no veo luz por ningún lado...

Vereis, tengo una pequeña página implementada usando el MVVM en Silverligth, cuyo modelo de datos, solo tiene tres propiedades, dos de ellas de tipo texto, y la otra es una propiedad de otra clase. Obviamente mis propiedades implementan el NotifyPropertyChanged, y demás.

Código:
public string Name{...}

public string LastName{....}

public PersonTypeModel PersonType{....}

//La clase PersonTypeModel solo tiene dos propiedades
public int Code{....}

public string Description{....}

Bien, yo cargo un DataGrid con varios objetos de este tipo. Y luego tengo unas cajas de texto enlazadas con las propiedades de texto. Cuando cambio el valor de las cajas, se actualiza correctamente el valor en la propiedad del objeto. Perfecto.

Luego tengo un combo, donde primero cargo todos los valores existentes para los PersonType que haya. Hasta aqui perfecto, ya tengo en el combo todos los PersonTypes cargados.

Cuando seleccione un elemento en el DataGrid, en el combo se selecciona el elemento correspondiente en relación a la propiedad PersonType del objeto seleccionado en el Grid. También me funciona. Perfecto.

Ahora el problema... cuando cambio el elemento del ComboBox, la propiedad asociada al objeto del elemento que está seleccionado en el Grid solo se actualiza a medias. Es decir el campo CODE. Pero en Description sigue estando el anterior.

Mi gran pregunta es, ¿Como puedo hacer, para que al cambiar el elemento en el combo, actualice la propiedad PersonType del objeto seleccionado en el Grid?

En el XAML tengo lo siguiente:
Código:
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,215,0,0"
                  ItemsSource="{Binding PersonTypeModelList, Mode=OneWay}"
                  SelectedValue="{Binding ElementName=dataGrid1, Path=SelectedItem.PersonType.Code, Mode=TwoWay}"
                  DisplayMemberPath="Description"
                  SelectedValuePath="Code"
                  Name="comboBox1" VerticalAlignment="Top" Width="139" />
Con el código XAML de arriba, la propiedad Code del objeto del Grid se actualiza correctamente, pero la Description se queda con lo anterior.

También probe esta forma:
Código:
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,215,0,0"
                  ItemsSource="{Binding PersonTypeModelList, Mode=OneWay}"
                  SelectedItem="{Binding ElementName=dataGrid1, Path=SelectedItem.PersonType, Mode=TwoWay}"
                  Name="comboBox1" VerticalAlignment="Top" Width="139">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <sdk:Label Content="{Binding Description}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
De esta forma, cuando cambio el elemento del ComboBox, SI me actualiza la propiedad. Pero lo que no hace es que cuando voy navegando entre los diferentes registros del Grid me aparezca en el combo seleccionado el elemento correspondiente.... :S

Por favor, alguien puede ayudarme con esto?? Veo que no soy capaz, por más intentos que hago...
__________________
Charlie.
  #2 (permalink)  
Antiguo 14/06/2012, 14:21
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

Buenas,

Podrías poner el código del datagrid (el xaml) y si tienes algo en el code behind, también, porque con lo que pones no nos podemos hacer una idea completa de como has hecho.

Saludos.
  #3 (permalink)  
Antiguo 15/06/2012, 01:26
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

Hola Alexg88, en primer lugar, muchas gracias por tu tiempo.

No tiene gran cosa mi DataGrid, la verdad...

Código:
        <sdk:DataGrid AutoGenerateColumns="False" Height="100" HorizontalAlignment="Left"
                      Margin="12,12,0,0" ItemsSource="{Binding PersonModelList}" Name="dataGrid1"
                      VerticalAlignment="Top" Width="392" IsReadOnly="True">            
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
                <sdk:DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
            </sdk:DataGrid.Columns>
</sdk:DataGrid>
El problema creo que lo tengo identificado, pero no sé como solucionarlo.

La cuestión es que cuando navego por los registros en el DataGrid, para que el ComboBox sepa si tiene que cambiar de elemento, se tiene que basar en una propiedad primitiva.

Código:
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,215,0,0"
                  ItemsSource="{Binding PersonTypeModelList, Mode=OneWay}"
                  SelectedValuePath="Code"
                  SelectedValue="{Binding ElementName=dataGrid1, Path=SelectedItem.PersonType.Code, Mode=TwoWay}"
                  Name="comboBox1" VerticalAlignment="Top" Width="139">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Description}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
Vale, hasta aquí perfecto. Según voy navegando por el Grid, el ComboBox se autoselecciona con el registro correspondiente del Grid. Parece que está bien enlazado.

Cuando cambio a mano el elemento en el ComboBox, la propiedad PersonType cambia adecuadamente su Code pero... la propiedad Description sigue con la anterior.

En resumidas cuentas, cuando cambio el Item del Combo, debería actualizarse por completo la propiedad PersonType del objeto que estoy editando.

Espero haberme explicado... :S
__________________
Charlie.
  #4 (permalink)  
Antiguo 15/06/2012, 03:31
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

No visualizo bien tu ejemplo, pero a ver si así te funciona.

Yo le quitaría el SelectedValuePath y lo enlazaría directamente la propiedad PersonType.


Código XML:
Ver original
  1. <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,215,0,0"
  2.                  ItemsSource="{Binding PersonTypeModelList, Mode=OneWay}"
  3.                  SelectedValue="{Binding ElementName=dataGrid1, Path=SelectedItem.PersonType, Mode=TwoWay}"
  4.                  DisplayMemberPath="Description"                
  5.                  Name="comboBox1" VerticalAlignment="Top" Width="139" />

Código XML:
Ver original
  1. <sdk:DataGrid AutoGenerateColumns="False" Height="100" HorizontalAlignment="Left"
  2.                      Margin="12,12,0,0" ItemsSource="{Binding PersonModelList}" Name="dataGrid1"
  3.                      VerticalAlignment="Top" Width="392" IsReadOnly="True">            
  4.             <sdk:DataGrid.Columns>
  5.                 <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
  6.                 <sdk:DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
  7.             </sdk:DataGrid.Columns>
  8. </sdk:DataGrid>
  #5 (permalink)  
Antiguo 15/06/2012, 04:21
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

Si, así como tú me dices también lo intenté alexg88.

Tal y como has puesto, efectivamente, al cambiar el elemento del combo, se actualiza la propiedad en el objeto enlazado. Eso va perfecto.

Pero... por algún motivo extraño, cuando voy navegando entre las diferentes filas del DataGrid, el combo no cambia al elemento que le corresponde en base al elemento seleccionado en el DataGrid.

¿Por qué podrá ser?

P.d: ¿Como hiciste para que aparezca tan claro tu código, con las líneas esas y demás? Moooola.
__________________
Charlie.
  #6 (permalink)  
Antiguo 15/06/2012, 04:39
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

¿En la propiedad PersonType has lanzado el evento de PropertyChanged?

Es la razón más probable por la que puede que no funcione.

PD: Para poner el código así, fíjate que en la barra de arriba (donde está lo de formatear) aparece un combo donde pone Highlight. Ahí eliges el lenguaje que quieres (en este caso, el más parecido es XML).
  #7 (permalink)  
Antiguo 15/06/2012, 05:00
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Silverlight: ComboBox Binding, actulizar propiedad de modelo al cambiar el

Si, si establecí el NotfiyPropertyChanged.

Creo que el problema está directamente en que no se admite un enlace a una "Propiedad Compleja". En mi último POST te dije que me funcionaba al cambiar el elemento del combo, la notificación de cambio en el objeto.

Pero parece que se "pierde el binding" cuando cambio toda la "propiedad compleja" (Llamo propiedad compleja a la propiedad PersonType).

Es decir...

Cuando tengo esto:
Código XML:
Ver original
  1. <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,215,0,0"
  2.                  ItemsSource="{Binding PersonTypeModelList, Mode=OneWay}"
  3.                  SelectedValuePath="Code"
  4.                  DisplayMemberPath="Description"
  5.                  SelectedValue="{Binding ElementName=dataGrid1, Path=SelectedItem.PersonType.Code, Mode=TwoWay}"
  6.                  Name="comboBox1" VerticalAlignment="Top" Width="139">
  7. </ComboBox>

Si voy cambiando de registros en el DataGrid, en el combo también se cambia correctamente. Y cuando cambio el elemento en el Combo, se actualiza correctamente la propiedad Code, del PersonType (Que pertenece, como propiedad, a un objeto del tipo PersonModel), pero no la propiedad Description. Es decir, lo hace a medias.


Sin embargo, cuando hago lo que me dijiste en el último POST pasa lo contrario:
- El combo esta cargado, pero segun navego por los registros del DataGrid el combo no va autoseleccionando la propiedad que le corresponde, respecto al registro seleccionado.
- Sin embargo, si selecciono una fila del DataGrid, y luego selecciono una de las opciones del Combo, el objeto del DataGrid actualiza correctamente la propiedad PersonType con el elemento que seleccione en el combo.

Vamos, un lio, me parece. Voy a ver si puedo subir unas imágenes y las pongo, para explicarme mejor todavía.

Gracias por tu tiempo alex, y gracias por lo de poner el código bonito, así ayuda más ;)
__________________
Charlie.

Etiquetas: actulizar, binding, combobox, modelo, propiedad, silverlight
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:36.