2016-11-12 18 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"); 
    } 
} 

做不到這一點......如果我只是嘗試閔getter或setter,當閩更改爲大於Max的值中直接使用「如果比較」的邏輯,我剛剛結束了與民平等到最大。

編輯:根據有關備份性能的建議我已經修改了的方法是:

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,作爲用戶迫使他們再次點擊兩個選手。如果用戶選擇高於最大值的Min,反之亦然,我將恢復到原來的將Max重置爲「No Maximum」的實現。

+0

屬性,屬性...你忘了支持字段? –

+1

@IvanStoev我無法忘記我還沒有學到什麼。 :) – RichardD

回答

1

您不能通過ref傳遞屬性,因爲屬性被轉換爲getter和setter方法。

當您將參數作爲參考使用性質的,而不是

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

感謝@dotctor。如果我只更改後備字段,怎麼可能仍然會觸發OnPropertyChanged?只需在二傳手中添加一個呼叫? – RichardD

+0

如果需要,您可以將名稱(如果需要,還可以傳遞其他參數)傳遞給'SwapIfGreater'並調用'OnPropertyChanged'。 – dotctor

1

後盾領域,其地址是過去了。一個屬性看起來像一個值,但它實際上是一對函數,每個函數都有不同的簽名。所以要傳遞一個屬性,實際上需要傳遞兩個函數指針,一個用於獲取,另一個用於該集合。

這是爲了傳遞給函數不是可變

即一個可變地址v的二函數指針的地址的完全不同的事。

因此,儘量避免通過屬性作爲參考或輸出。

Dotctor爲您提供了正確的解決方案。

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