Como posso evitar recursão quando atualizar minhas propriedades ViewModel?
-
06-07-2019 - |
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
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");
}
}