ViewModel 속성을 업데이트 할 때 재귀를 피하려면 어떻게해야합니까?
-
06-07-2019 - |
문제
내 생각에 나는 a 슬라이더 그리고 a 콤보 박스.
내가 슬라이더를 변경하십시오, 나는 Combobox가 바뀌기를 원합니다.
내가 Combobox를 변경하십시오, 나는 슬라이더가 바뀌기를 원합니다.
나는 하나 또는 다른 하나를 udpate 할 수 있지만, 둘 다 업데이트하려고하면 나는 stackoverflow 오류 한 속성은 다른 속성을 무한 루프로 계속 업데이트하기 때문에.
나는 a를 넣으려고 노력했다 recalculate () 업데이트가 한 곳에서 수행되지만 여전히 재귀 문제가 발생합니다.
재귀로 들어 가지 않고 각 컨트롤 업데이트를 어떻게 업데이트 할 수 있습니까?
보기 :
<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}"/>
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
해결책
세트 기능에서 다음과 같은 것과 같은 시도를 시도하십시오.
public int SelectedCustomerIndex
{
get
{
return _selectedCustomerIndex;
}
set
{
if (value != _selectedCustomerIndex)
{
_selectedCustomerIndex = value;
OnPropertyChanged("SelectedCustomerIndex");
SelectedCustomer = _customers[_selectedCustomerIndex];
}
}
}
실제 가치 변화가있을 때만 이벤트를 발사합니다. 이런 식으로, 동일한 값을 가진 세트 속성에 대한 두 번째 호출은 다른 변경 이벤트를 유발하지 않습니다.
물론 다른 속성을 위해서도 그렇게해야합니다.
다른 팁
두 속성 모두 서로로 호출되므로 재귀가 있습니다. 결합과 전혀 관련이 없습니다. 적절한 방법은 서로를 변경하고 속성이 변경 될 때 두 속성에 대한 화재 변경 알림입니다.
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");
}
}
제휴하지 않습니다 StackOverflow