2014-11-03 144 views
2

如果我想通過RaisePropertyChanged更新我的UI,我得到了一個奇怪的行爲。 我使用this post的第二個解決方案(by Johnathan1):我實現了RadioBoolToIntConverter。RaisePropertyChanged設置回單選按鈕的值

我的虛擬機看起來是這樣的:

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

轉換器看起來像這樣(由this post Jonathan1):

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是模型的一個布爾值,它是負責的,如果我的顯示或未顯示將被過濾的值。這是綁定使用RadioBoolToIntConverter 2個單選按鈕:

<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> 

綁定和切換的單選按鈕是否工作正常。

問題是如果我設置由代碼_Filter.FilterMyProperty = true(設定一個標準過濾器,其中這個值應該被過濾),然後執行所述RaisePropertyChanged("myFilterRadioButtonInt")_Filter.FilterMyProperty將被設置爲false

編輯:

通過RaisePropertyChanged("myFilterRadioButtonInt")(由VM中的篩選器屬性設置者的稱呼)的myFilterRadioButtonInt設置器再次調用,它將設置RadioBox的電流值(在我的情況下value2所以setter方法折戟_Filter.FilterMyPropertyfalse

這是不可能通過代碼用這種方法來改變選項框的值。我想,當我打電話RaisePropertyChanged("myFilterRadioButtonInt")只,吸氣將被調用。 我該如何解決這個問題,爲什麼通過RaisePropertyChanged("myFilterRadioButtonInt")調用setter?

編輯:

返回在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 2014-11-03 13:41:14

+0

@Blam添加轉換器的問題。 – RodMcKay 2014-11-03 14:21:28

+0

通常只調用getter,否則(如果調用者被調用)將會出現一些*** StackOverflow ***異常,顯然在setter中調用了'RaisePropertyChanged'。所以我懷疑還有其他一些代碼觸發setter,而不是'RaisePropertyChanged()'。 – 2014-11-03 15:28:44

回答

0

爲什麼要退的參數作爲值

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

第一個按鈕會每次和第二假每次值設置爲true。

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 2014-11-05 08:26:05

0

我發現這個article它提供了一個一致的解決方案。我嘗試了OP中的解決方案,它對我來說並不一致 - 我有隨機實例,其中所選單選按鈕沒有正確反映。

的ConvertBack應該是:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value.Equals(false) ? DependencyProperty.UnsetValue : parameter; 
    }