2016-11-12 2 views
2

통과 할 수 없습니다 : 당신은 심판에 의해 등록 정보를 전달할 수 없습니다로ViewModel에서 속성 값을 바꾸는 방법은 무엇입니까? 내가 이상적으로이 같은 방법을 사용하여, 두 개의 뷰 모델 공용 속성의 값을 비교하고 교환하고 싶습니다 심판

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T> 
{ 
    T temp; 
    if (lhs.CompareTo(rhs) > 0) 
    { 
     temp = lhs; 
     lhs = rhs; 
     rhs = temp; 
    } 
} 

을하지만, 내 ViewModel에서이 작업을 수행 할 수 없습니다.

private Int32 max; 
public Int32 Max 
{ 
    get { return max; } 
    set 
    { 
     SwapIfGreater<Int32>(ref Min, ref Max); 
     max = value; 
     OnPropertyChanged("Max"); 
    } 
} 

private Int32 min; 
public Int32 Min 
{ 
    get { return min; } 
    set 
    { 
     SwapIfGreater<Int32>(ref Min, ref Max); 
     min = value; 
     OnPropertyChanged("Min"); 
    } 
} 

난 그냥 최소가 최대보다 큰 값으로 변경되는 최소 게터 또는 세터 내에서 직접 "비교하면"논리를 사용하려고하면 그게 ... 난 그냥 최소 동일로 결국 실패 ~ 맥스.

편집은 : 속성을 백업하는 방법에 대한 조언에 근거하여 나는이에 방법을 수정했습니다

void SwapIfGreater<T>(ref T lhs, ref T rhs, String otherPropertyName) where T : System.IComparable<T> 
{ 
    T temp; 
    if (lhs.CompareTo(rhs) > 0) 
    { 
     temp = lhs; 
     lhs = rhs; 
     rhs = temp; 
     OnPropertyChanged(otherPropertyName); 
    }    
} 

이에 "최소"속성 setter :

min = value; 
    SwapIfGreater<Int32>(ref min, ref max, "Max");     
    OnPropertyChanged("Min"); 

무엇 오전 내가 빠졌어? Min이 Max보다 큰 경우 이것은 Max를 Min으로 설정하는 것입니다.

편집 : 나는, 내가 위에서 잘못하고있어 무엇을 배우고 싶어 해요 내가 다시 복제하고 싶은 스왑 동작을 구현하는 UI를 테스트하는 데 있지만, 나는 사용자로, 그것은 불쾌한 UX의 실현했습니다 두 피커를 다시 클릭해야합니다. 사용자가 Max보다 높은 Min을 선택하면 Max를 "No Maximum"로 리셋하는 원래 구현으로 되돌릴 것입니다.

+0

속성, 속성 ... 배경 필드를 잊어 버리셨습니까? –

+1

@IvanStoev 나는 아직 배웠던 것을 잊을 수 없었다. :) – RichardD

답변

1

속성이 getter 및 setter 메서드로 변환되므로 ref로 속성을 전달할 수 없습니다. 당신이 심판으로 매개 변수를 전달하면

이 속성의 지원 필드 대신

SwapIfGreater<Int32>(ref min, ref max); 
+0

감사합니다 @dotctor. 내가 뒷받침 필드 만 바꾸면 어떻게 OnPropertyChanged가 계속 트리거 될 수 있습니까? 세터 모두에게 전화를 걸면됩니까? – RichardD

+0

이름 (및 필요한 경우 다른 인수)을 SwapIfGreater에 전달하고 필요할 경우 OnPropertyChanged를 호출 할 수 있습니다. – dotctor

1

를 사용하여, 그 주소는 통과했다. 속성은 값처럼 보이지만 실제로는 서로 다른 서명을 가진 함수 쌍입니다. 따라서 프로퍼티를 전달하기 위해서는 get과 set에 두 개의 함수 포인터를 전달해야합니다.

이것은 가변

즉 하나의 변수 어드레스 V의 두 함수 포인터의 어드레스보다 함수에 전달 완전히 다른 것이된다.

따라서 Ref 또는 Out으로 속성을 전달하지 않도록하십시오.

Dotctor가 올바른 해결책을 제공했습니다.

SwapIfGreater<Int32>(ref min, ref max); 
관련 문제