RaisePropertyChanged设置单选按钮的值
本文关键字:单选按钮 设置 RaisePropertyChanged | 更新日期: 2023-09-27 18:28:56
如果我想通过RaisePropertyChanged更新我的UI,我会有一个奇怪的行为。我使用这篇文章的第二个解决方案(Johnathan1):我实现了RadioBoolToIntConverter。
我的虚拟机是这样的:
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的这篇文章):
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
<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中Filter属性的设置器调用),再次调用myFilterRadioButtonInt
的设置器,它将设置RadioBox的当前值(在我的情况下,value
是2
,因此设置器将把_Filter.FilterMyProperty
设置回false
使用此方法无法通过代码更改RadioBoxes的值。我想当我调用RaisePropertyChanged("myFilterRadioButtonInt")
时,只会调用getter。如何解决这个问题?为什么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;
}
我发现这篇文章提供了一个一致的解决方案。我在OP中尝试了这个解决方案,但它对我来说并不总是有效——我有一些随机的例子,其中所选的单选按钮没有正确反映。
ConvertBack应为:
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
}
为什么将参数作为值返回
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return parameter;
}
第一个按钮每次都将值设置为true,第二个按钮每次设置为false。
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。