2014-11-03 3 views
2

У меня странное поведение, если я хочу обновить свой интерфейс пользователя RaisePropertyChanged. Я использую второе решение (от Johnathan1) от this post: я реализовал RadioBoolToIntConverter.RaisePropertyChanged устанавливает значение переключателей

My VM выглядит следующим образом:

public int myFilterRadioButtonInt 
     { 
      get 
      { 
       return _Filter.FilterMyProperty ? 1 : 2; 
      } 
      set 
      { 
       if (value == 1) 
        _Filter.FilterMyProperty = true; 
       else if (value == 2) 
        _Filter.FilterMyProperty = false; 
       else 
        return; 

       RaisePropertyChanged("myFilterRadioButtonInt"); 
      } 
     } 

конвертер выглядит следующим образом (по Jonathan1 из this post):

public class RadioBoolToIntConverter : IValueConverter 

    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      int integer = (int)value; 
      if (integer==int.Parse(parameter.ToString())) 
       return true; 
      else 
       return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return parameter; 
     } 
    } 

Для понимания _Filter.FilterMyProperty является булево значение модели, которая несет ответственность, если мой значение, которое будет отфильтровано, отображается или не отображается. Это переплетены 2 радиокнопок с помощью RadioBoolToIntConverter:

<RadioButton IsChecked="{Binding Path=myFilterRadioButtonInt, Converter={StaticResource RadioBoolToIntConverter}, ConverterParameter=1}">Show</RadioButton> 
<RadioButton IsChecked="{Binding Path=myFilterRadioButtonInt, Converter={StaticResource RadioBoolToIntConverter}, ConverterParameter=2}">Don't show</RadioButton> 

Связывание и переключая Radiobuttons работает должным образом.

Проблема в том, если установить _Filter.FilterMyProperty = true с помощью кода (установить стандартный фильтр, где это значение должно быть фильтрованной), а затем сделать RaisePropertyChanged("myFilterRadioButtonInt")_Filter.FilterMyProperty будет установлен в false.

Edit:

По RaisePropertyChanged("myFilterRadioButtonInt") (наречено сеттер фильтра собственности в VM) сеттер myFilterRadioButtonInt вызывается снова, и он будет установить текущее значение RadioBox (в моем случае value является 2 поэтому сеттер будет установлен обратно _Filter.FilterMyProperty к false.

это не возможно изменить стоимость RadioBoxes кода с помощью этого метода. Я думал, что только добытчик будет вызываться, когда я называю RaisePropertyChanged("myFilterRadioButtonInt"). Как я могу решить эту проблему и почему вызывающий абонент вызывает RaisePropertyChanged("myFilterRadioButtonInt")?

Edit:

Возвращаясь параметр в ConvertBack() была проблема. Вот мое решение:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    bool val; 
    if (!bool.TryParse(value.ToString(), out val)) 
     return 0; 

    int iParam; 
    if (!int.TryParse(parameter.ToString(), out iParam)) 
     return 0; 

    return val ? iParam : 0; 
} 
+0

RaisePropertyChanged ("myFilterRadioButtonInt"); не меняет значение _Filter.FilterMyProperty. Поместите конвертер. Бьюсь об заклад, конвертер меняет значение. – Paparazzi

+0

@Blam добавил конвертер к вопросу. – RodMcKay

+0

обычно вызывается только getter, в противном случае (если бы был вызван сеттер) было бы какое-то *** исключение StackOverflow ***, очевидно, что вызов в RaiffPropertyChanged в setter. Поэтому я сомневаюсь, что есть еще какой-то другой код, запускающий setter, а не 'RaisePropertyChanged()'. –

ответ

0

Почему вы возвращенная параметр в качестве значения

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return parameter; 
} 

Первая кнопка собирается установить значение истинно каждый раз, а второй к ложному каждый раз.

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    Bool vBool = Bool.Parse(value); 
    Int iParam = IntParse(parameter); 
    if(iParm > 2 || iParem < 0) return false; 
    if(vBool) return iParam; 
    else if (iParam == 2) return 1; 
    else return 2; 
} 

Также на множестве, если текущее значение правильно, вы должны немедленно вернуться и не называть RaisePropertyChanged.

+0

Возврат параметра был проблемой. Я добавил решение вопроса. – RodMcKay

0

Я нашел это article, который обеспечивает согласованное решение. Я попробовал решение в OP, и он не работал последовательно для меня - у меня были случайные экземпляры, когда выбранный переключатель был неправильно отображен.

ConvertBack должно быть:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value.Equals(false) ? DependencyProperty.UnsetValue : parameter; 
    } 
Смежные вопросы