none
Cómo puedo ver los cambios en una ObservableCollection dentro de un ViewModel (WPF) RRS feed

  • Pregunta

  • Siguiendo con mi requerimiento en WPF, tengo una Clase llamada CuentasxCobrarCL.cs que implementa INotifyPropertyChanged, que entre sus propiedades tiene una bool llamada seleccionada, y una float llamada importe

    Luego, tengo un ViewModel llamado AsignaFacturasVM.cs que también implementa INotifyPropertyChanged, y que tiene entre otras propiedades un long llamado ImporteAcumulado y una ObservableCollection<CuentasxCobrarCL> llamada CuentasxCobrar 

    CuentasxCobrar sirve de ItemSource de mi Datagrid en mi View y maneja correctamente los datos de la colección, y todo está muy bien, salvo que no se actualiza nunca mi propiedad ImporteAcumulado, que debería ser la suma de los importe cuando seleccionada sea true   

    Dentro de mi ViewModel tengo la definición de la propiedad CuentasxCobrar como:

    #region CuentasxCobrar
    private ObservableCollection<CuentasxCobrarCL> _cuentasxcobrar;
    public ObservableCollection<CuentasxCobrarCL> CuentasxCobrar
    {
        set
        {
            _cuentasxcobrar = value;
            _importeacumulado = 0;
            foreach (var item in _cuentasxcobrar)
            {
                _importeacumulado += item.seleccionada ? item.importepago : 0;
            }
            OnPropertyChanged("CuentasxCobrar");
            OnPropertyChanged("ImporteAcumulado");
        }
        get { return _cuentasxcobrar; }
    }
    #endregion

    así que yo esperaría que cada vez que se haga un cambio a la colección dentro de mi Datagrid, se ejecute esta parte y así se calcule el ImporteAcumulado, pero esto nunca sucede, salvo la primera vez, en que se crea la colección y se llena de elementos mediante un SP

    Alguna sugerencia?



    cyndyrdz

    martes, 10 de julio de 2018 14:23

Respuestas

Todas las respuestas

  • Investigando encontré algo que me debería ayudar, pero  no se que pasa que nunca se ejecuta!!!

    dentro de la declaración de mi view xaml, agregué la referencia:

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

    y en la definición del Datagrid:

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp" >
            <i:InvokeCommandAction Command="{Binding MouseLeftButtonUpCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

    y dentro del cs de mi ViewModel:

    private void ActualizaImporteAcumulado()
    {
        _importeacumulado = 0;
        foreach (var item in _cuentasxcobrar)
        {
            _importeacumulado += item.seleccionada ? item.importepago : 0;
        }
        OnPropertyChanged("ImporteAcumulado");
    }
    
    #region MouseLeftButtonCommand
    private RelayCommand _mouseLeftButtonUpCommand;
    public RelayCommand MouseLeftButtonUpCommand
    {
        get
        {
            return _mouseLeftButtonUpCommand
                ?? (_mouseLeftButtonUpCommand = new RelayCommand(
                () =>
                {
                    ActualizaImporteAcumulado(); // the handler goes here 
                }));
        }
    }
    
    public class RelayCommand : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        private Action methodToExecute;
        private Func<bool> canExecuteEvaluator;
        public RelayCommand(Action methodToExecute, Func<bool> canExecuteEvaluator)
        {
            this.methodToExecute = methodToExecute;
            this.canExecuteEvaluator = canExecuteEvaluator;
        }
        public RelayCommand(Action methodToExecute)
            : this(methodToExecute, null)
        {
        }
        public bool CanExecute(object parameter)
        {
            if (this.canExecuteEvaluator == null)
            {
                return true;
            }
            else
            {
                bool result = this.canExecuteEvaluator.Invoke();
                return result;
            }
        }
        public void Execute(object parameter)
        {
            this.methodToExecute.Invoke();
        }
    }
    #endregion

    entonces al checkear el CheckBox dentro de mi Datagrid bindado a seleccionada, yo esperaría que se ejecutara mi método MouseLeftButtonUpCommand, pero este nunca se ejecuta!!

    Ideas?   


    cyndyrdz


    martes, 10 de julio de 2018 16:27
  • jueves, 12 de julio de 2018 15:48