2016-11-12 1 views
2

Я хотел бы сравнить и поменять местами значения двух открытых свойств ViewModel, в идеале, используя метод, как это:Как изменить значения свойств в 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"); 
    } 
} 

В противном случае ... если я просто пытаюсь использовать «если сравнивать» логику непосредственно в геттер или сеттера Min, когда Min изменяется на значение, большее, чем Макс, я в конечном итоге с Min равной до Макс.

EDIT: На основе рекомендаций о резервном свойства я внес изменения в метод это:

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); 
    }    
} 

и "Min" сеттер собственности на это:

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

Что утра Я пропустил? Это еще только установка Max to Min, когда Min больше Max.

EDIT: Хотя я заинтересован, чтобы узнать, что я делаю неправильно, выше, снова реализующее поведение своп Я хотел повторить тестирование пользовательского интерфейса, я понял, что это противный UX, как пользователь это сила, чтобы затем снова щелкнуть оба сборщика. Я вернусь к первоначальной реализации сброса Max до «Без ограничений», если пользователь выбирает Min выше Max и наоборот.

+0

Недвижимость, недвижимость ... Вы забыли о подкладках? –

+1

@ ИванСтоев Я не мог забыть то, что еще не узнал. :) – RichardD

ответ

1

Вы не можете передавать свойства по ссылке, поскольку свойства передаются методам getter и setter.

Используйте отступающие поля свойств вместо

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

Спасибо @dotctor. Как я могу по-прежнему запускать OnPropertyChanged, если я изменяю только поля поддержки? Просто добавьте вызов как в сеттер? – RichardD

+0

Вы можете передать имена (и другие аргументы в случае необходимости) в 'SwapIfGreater' и при необходимости вызвать« OnPropertyChanged ». – dotctor

1

При передаче параметра в исх, его адрес он прошел. Свойство выглядит как значение, но на самом деле это пара функций, каждая с другой подписью. Таким образом, чтобы передать свойство, вам действительно нужно передать два указателя функций: один для get и один для набора.

Это совершенно другая вещь, чтобы перейти к функции, чем адрес переменной

т.е. один два указателя функции адрес переменной v в.

Итак, старайтесь не пропускать свойства как Ref или Out.

Dotctor предоставил вам правильное решение.

SwapIfGreater<Int32>(ref min, ref max); 
Смежные вопросы