Pregunta

En mi vista, tengo un control deslizante y un cuadro combinado .

Cuando cambio el control deslizante , quiero que cambie el cuadro combinado.

Cuando cambio el cuadro combinado , quiero que cambie el control deslizante.

Puedo udpatear uno u otro, pero si trato de actualizar ambos obtengo un error StackOverflow ya que una propiedad sigue actualizando a la otra en un bucle infinito.

He intentado poner un Recalculate () donde la actualización se realiza en un solo lugar, pero aún me encuentro con el problema de recurrencia.

¿Cómo puedo hacer que cada control actualice al otro sin entrar en recursión?

en Vista:

<ComboBox 
    ItemsSource="{Binding Customers}"
    ItemTemplate="{StaticResource CustomerComboBoxTemplate}"
    Margin="20"
    HorizontalAlignment="Left"
    SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>


<Slider Minimum="0" 
        Maximum="{Binding HighestCustomerIndex, Mode=TwoWay}" 
        Value="{Binding SelectedCustomerIndex, Mode=TwoWay}"/>

en ViewModel:

#region ViewModelProperty: SelectedCustomer
private Customer _selectedCustomer;
public Customer SelectedCustomer
{
    get
    {
        return _selectedCustomer;
    }

    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("SelectedCustomer");
        SelectedCustomerIndex = _customers.IndexOf(_selectedCustomer);
    }
}
#endregion

#region ViewModelProperty: SelectedCustomerIndex
private int _selectedCustomerIndex;
public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        _selectedCustomerIndex = value;
        OnPropertyChanged("SelectedCustomerIndex");
        SelectedCustomer = _customers[_selectedCustomerIndex];
    }
}
#endregion
¿Fue útil?

Solución

pruebe en el conjunto de funciones algo como:

public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        if (value != _selectedCustomerIndex)
        {
         _selectedCustomerIndex = value;
         OnPropertyChanged("SelectedCustomerIndex");
         SelectedCustomer = _customers[_selectedCustomerIndex];
        }
    }
}

para disparar los eventos solo cuando hay un cambio real en el valor. De esta manera, una segunda llamada a la propiedad set con el mismo valor no causa otro evento de cambio.

También debe hacer eso para la otra propiedad, por supuesto.

Otros consejos

Ambas propiedades se llaman entre sí, de ahí la recursividad. No está relacionado con el enlace en absoluto. La forma correcta es cambiar entre sí y activar la notificación de cambio para ambas propiedades cuando cualquiera de las propiedades cambia:

    public Customer SelectedCustomer
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomer = value;
            _selectedCustomerIndex = _customers.IndexOf(value);

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }

    public int SelectedCustomerIndex
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomerIndex = value;
            _selectedCustomer = _customers[_selectedCustomerIndex];

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top