如果我想通過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的電流值(在我的情況下value
被2
所以setter方法折戟_Filter.FilterMyProperty
到false
。
這是不可能通過代碼用這種方法來改變選項框的值。我想,當我打電話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;
}
RaisePropertyChanged( 「myFilterRadioButtonInt」);不會改變_Filter.FilterMyProperty的值。張貼轉換器。我敢打賭,轉換器正在改變價值。 – Paparazzi 2014-11-03 13:41:14
@Blam添加轉換器的問題。 – RodMcKay 2014-11-03 14:21:28
通常只調用getter,否則(如果調用者被調用)將會出現一些*** StackOverflow ***異常,顯然在setter中調用了'RaisePropertyChanged'。所以我懷疑還有其他一些代碼觸發setter,而不是'RaisePropertyChanged()'。 – 2014-11-03 15:28:44