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的当前值(在我的情况下,value2,因此设置器将把_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;
}

RaisePropertyChanged设置单选按钮的值

我发现这篇文章提供了一个一致的解决方案。我在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。