ViewModel 속성을 업데이트 할 때 재귀를 피하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1012812

  •  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");
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top