Domanda

Nella mia vista ho un cursore e una casella combinata .

Quando cambio il dispositivo di scorrimento , desidero cambiare la casella combinata.

Quando cambio la casella combinata , voglio che il cursore cambi.

Posso udpare l'uno o l'altro, ma se provo ad aggiornare entrambi ottengo un errore StackOverflow poiché una proprietà continua ad aggiornare l'altra in un ciclo infinito.

Ho provato a inserire un Ricalcola () in cui l'aggiornamento viene eseguito in un unico punto, ma riscontro ancora il problema di ricorsione.

Come posso fare in modo che ciascun controllo aggiorni l'altro senza ricorrere alla ricorsione?

in Visualizza:

<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}"/>

in 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
È stato utile?

Soluzione

prova nelle funzioni set qualcosa come:

public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

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

per attivare gli eventi solo quando si verifica una variazione effettiva del valore. In questo modo, una seconda chiamata alla proprietà set con lo stesso valore non provoca un altro evento di modifica.

Ovviamente devi farlo anche per l'altra proprietà.

Altri suggerimenti

Entrambe le proprietà sono chiamate l'una dall'altra, quindi la ricorsione. Non è per niente vincolante. Il modo corretto è di cambiarsi a vicenda e attivare la notifica di modifica per entrambe le proprietà quando una delle proprietà 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");
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top