none
Dudas de MVVM RRS feed

  • Pregunta

  • Tengo una duda

    Tengo mi model que implementa tengo lo siguiente

     private string _NumeroDocumento;
        public string NumeroDocumento
        {
          get { return _NumeroDocumento; }
          set
          {
            _NumeroDocumento = value;
            OnPropertyChanged("NumeroDocumento");
          }
        }
    

    y en el control tengo <TextBox Text{Binding Path=NumeroDocumento} />

    El problema es que si no pierdo el foco del text no almacena el valor en la propiedad, solo lo hace cuando pierdo el foco del textbox, que puede ser o es normal, como puedo solucionar esto.

     

    Gracias


    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    viernes, 1 de abril de 2011 23:09

Respuestas

  • Con permiso....

    Felipe Sotelo:

    El uso de eventos en MVVM es como darle Whisky a un alcoholico para curarlo... un sintoma de que algo no esta bien :D

    Puede que parezca muy taliban, pero los eventos están prohibidos en MVVM a no ser en casos de extrema necesidad!!!

    Espero que comprendas que no es un ataque personal ni nada por el estilo, simplemente que no se resuelven los problemas rompiendo el patrón...

    Daniel20:

    Lo que quieres hacer es que se actualice el control segun el usuario va tecleando, esto lo consigues estableciendo la propiedad UpdateSourceTrigger del Binding a PropertyChanged, es decir, que actualice los valores cuando esten cambiando, en este caso, mientras se escriba:

    <TextBox Text="{Binding Path=NumeroDocumento,UpdateSourceTrigger=PropertyChanged}" />
    

    Para los dos:

    Mirad el artículo sobre compartir código y MVVM que tengo en mi blog, explica muchas cosas de MVVM y Bindings:

    Parte 1

    Parte 2

    Un saludo!!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    • Marcado como respuesta Daniel20 lunes, 4 de abril de 2011 14:48
    sábado, 2 de abril de 2011 8:49
    Moderador

Todas las respuestas

  • Una forma de solucionarlo podría ser la siguiente:

    Debes usar el evento KeyDown podría se así:

    MiControlTextBox.KeyDown += ((s,ea) => {

          BindingExpression b =   (s as TextBox).GetBindingExpression(TextBox.TextProperty);

         if(b != null){

               b.UpdateSource();

         }

    });

    O bien

    private void TextBox1_KeyUp(object sender, RoutedEventArgs e){

    BindingExpression b = (TextBox1).GetBindingExpression(TextBox.TextProperty);

    if(b != null){

    b.UpdateSource();

    }

    }

    Así con esto cada vez que oprimas una tecla se ira actualizando el Biding enlazado a la propiedad de dependencia o (DependencyProperty) del TextBox.

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    sábado, 2 de abril de 2011 4:19
  • Con permiso....

    Felipe Sotelo:

    El uso de eventos en MVVM es como darle Whisky a un alcoholico para curarlo... un sintoma de que algo no esta bien :D

    Puede que parezca muy taliban, pero los eventos están prohibidos en MVVM a no ser en casos de extrema necesidad!!!

    Espero que comprendas que no es un ataque personal ni nada por el estilo, simplemente que no se resuelven los problemas rompiendo el patrón...

    Daniel20:

    Lo que quieres hacer es que se actualice el control segun el usuario va tecleando, esto lo consigues estableciendo la propiedad UpdateSourceTrigger del Binding a PropertyChanged, es decir, que actualice los valores cuando esten cambiando, en este caso, mientras se escriba:

    <TextBox Text="{Binding Path=NumeroDocumento,UpdateSourceTrigger=PropertyChanged}" />
    

    Para los dos:

    Mirad el artículo sobre compartir código y MVVM que tengo en mi blog, explica muchas cosas de MVVM y Bindings:

    Parte 1

    Parte 2

    Un saludo!!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    • Marcado como respuesta Daniel20 lunes, 4 de abril de 2011 14:48
    sábado, 2 de abril de 2011 8:49
    Moderador
  • Hola, sip gracias totalmente de acuerdo. En Silverlight 3 cómo haces para especificar , UpdateSourceTrigger=PropertyChanged?

    Saludos.


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    sábado, 2 de abril de 2011 17:27
  • Buenas Felipe!

    Por defecto PropertyChanged no está disponible en Silverlight 3, aun así, la solución pasa por crear un Behaviour propio que capture el cambio del contenido del control y fuerze una actualización del binding.

    Al usar un behaviour tienes dos ventajas frente al uso de eventos: 1º Sigues teniendo el mínimo código en Code Behind y el código del behaviour es totalmente reutilizable entre el resto de controles e independiente de un control o página específicos.

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    domingo, 3 de abril de 2011 6:44
    Moderador
  • Josue muchas gracias, esa era la respuesta, ahora la pregunta es, como puedo hacer eso mismo desde codigo, puesto que tengo un Custom TextBox y quiero que siempre se use me haga el UpdateTriggre.

     

    Gracias


    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    lunes, 4 de abril de 2011 14:48
  • Buenas!

    Ten en cuenta que el UpdateSourceTrigger es una propiedad del Binding que definas en tu control en el momento de usarlo y no del propio textbox por lo que no puedes incluir ese comportamiento por defecto :(

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    lunes, 4 de abril de 2011 16:09
    Moderador
  • Josue, muchas gracias,

     

    que pena molestarte otra vez

     

    Es que en el mismo modelo tengo un datagrid, el cual se adicionan elementos, por medio de una propiedad, y el itemsource del datagrid es 

    un list<string>, lo adiiciono bien, pero no me refresca los items, como puedo hacerlo, sin interactuar directamente con el datagrid sino con MVVM.

     

    Gracias


    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    lunes, 4 de abril de 2011 16:29
  • Lo mejor es que enlaces este list a una Entidad u objeto Personalizado así sólo hagas binding a una propiedad e inmplementar INotifyPropertyChanged!

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    lunes, 4 de abril de 2011 16:33
  • Eso es lo que hago mira como lo tengo

     

    private <string> _Propietario
    Public List<string> Propietario
    get
    {
      return _Propietario;
    }
    set
    {
     _Propietario=value;
     OnPropertyChanges("Propietario");
    }
    
    
    
    
    El datagrid tiene ItemsSource="{Binding Path=Propietarios,Mode=TwoWay}"


    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    lunes, 4 de abril de 2011 17:44
  • No se pero no entiendo por qué la propiedad la cuantificas en singular y el tipo de datos deba ser string pero lo que te digo es:

    public class Propiedad: INotifyPropertyChanged{

           private List<Propietario> propietarios;

           public List<Propietario> Propietarios{

         get
         {  
           return _propietarios;
          }
          set
         {
            _propietarios=value;
            OnPropertyChanges("Propietarios");
         }

           }

    ///No olvides la implementación de la interface!

    }

    Saludos


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    lunes, 4 de abril de 2011 17:55
  • Sisis asi lo tengo, depronto antes escribi mal, pero si asi lo tengo, cuando le hago refresh al datagrid me aparecen los datos.
    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    lunes, 4 de abril de 2011 18:22
  • Umm bueno ok entonces revisa este link, http://mariaevert.dk/thesis/?p=735

    Saludos!


    Custom Control Silverlight
    "Blog Ingphillip's Prog: TODO WEB
    lunes, 4 de abril de 2011 19:19
  • Gracias, pero no era lo que necesitaba, ya lo soluione el error era que estaba usando mal las variables

    Tengo otra duda tengo lo siguiente

     

     

       <DataGrid Grid.Row="2" Grid.ColumnSpan="3" ItemsSource="{Binding Path=SoapList}" AutoGenerateColumns="False"   >
                <DataGrid.Columns >
                    
                    <DataGridTemplateColumn Header="Abrir"   >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Open" CommandParameter="{Binding Path=SOAP_ID}" 
                                        Command="{Binding Path=OpenCommand}" Name="cmdOpen" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="ID" Binding="{Binding Path=SOAP_ID}" IsReadOnly="True" ></DataGridTextColumn>
                    <DataGridTextColumn Header="Tipo" Binding="{Binding Path=SOAP_TIPO}" IsReadOnly="True"  ></DataGridTextColumn>
                    <DataGridTextColumn Header="Mensaje" Binding="{Binding Path=SOAP_TEXT}"  Width="490" IsReadOnly="True" ></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>

    <Button Content="Open" CommandParameter="{Binding Path=SOAP_ID}" 
                                        Command="{Binding Path=OpenCommand}" Name="cmdOpen" />
    El Open command es este:
     public ICommand OpenCommand
        {
          get
          {
            if (_OpenCommand == null)
              _OpenCommand = new DelegateCommand(new Action(OpenSoap));
    
            return _OpenCommand;
          }
        }
    

    Pero la funcion OpenSoap no se ejecuta, si saco ese boton del DataGrid, hay si lo hace, me da la impresion es porque el datagrid establece un DataContext Diferente pero no se, como hago para que el boton me ejecute dicha funcion.

     

    Gracias.


    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    lunes, 4 de abril de 2011 23:09
  • Hola Daniel,

    Perdona por no responder antes, he estado algo liado :)

    Creo que lo mejor sería que abrieses otra consulta para la nueva pregunta, para separar las consultas en el foro y que otros usuarios puedan colaborar.

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    martes, 5 de abril de 2011 4:18
    Moderador