Pergunta

Em minha opinião eu tenho um barra e combobox .

Quando eu alterar o controle deslizante , quero que a caixa de combinação para a mudança.

Quando eu mudar a combobox , eu quero o controle deslizante para a mudança.

Eu posso udpate um ou o outro, mas se eu tento atualizar tanto eu recebo um Erro StackOverflow desde uma propriedade mantém atualizando o outro em um loop infinito.

Eu tentei colocar em um Recalcular () , onde a atualização é feita em um lugar, mas ainda correr para o problema recursão.

Como posso ter cada atualização controle o outro sem entrar em recursão?

em exibição:

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

em 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
Foi útil?

Solução

tentar nas funções definidas algo como:

public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

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

para disparar os eventos apenas quando há uma mudança real no valor. Desta forma, uma segunda chamada para a propriedade conjunto com o mesmo valor não causar outro evento de alteração.

Você tem que fazer isso para a outra propriedade, bem claro.

Outras dicas

Ambas as propriedades são chamados entre si, daí a recursividade. Não relacionados com a ligação em tudo. maneira correta é mudar o outro e mudança fogo notificação para ambas as propriedades quando qualquer propriedade muda:

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top