gpt4 book ai didi

c# - RaisePropertyChanged 设置回单选按钮的值

转载 作者:行者123 更新时间:2023-11-30 17:46:05 29 4
gpt4 key购买 nike

如果我想通过 RaisePropertyChanged 更新我的 UI,我会遇到一个奇怪的行为。我使用 this post 的第二个解决方案(由 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");
}
}

转换器看起来像这样(来自 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 是模型的 bool 值,它负责显示或不显示我将被过滤的值。这使用 RadioBoolToIntConverter 绑定(bind)到 2 个 RadioButtons:

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

绑定(bind)和切换 RadioButtons 工作正常。

问题是,如果我通过代码设置 _Filter.FilterMyProperty = true(在应该过滤该值的位置设置一个标准过滤器),然后执行 RaisePropertyChanged("myFilterRadioButtonInt") _Filter.FilterMyProperty 将设置为 false

编辑:

通过 RaisePropertyChanged("myFilterRadioButtonInt")(由 VM 中 Filter Property 的 setter 调用)再次调用 myFilterRadioButtonInt 的 setter ,它将设置当前RadioBox 的值(在我的例子中,value2,因此 setter 会将 _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;
}

最佳答案

我找到了这个 article它提供了一致的解决方案。我尝试了 OP 中的解决方案,但它对我来说并没有始终如一的效果——我遇到了随机实例,其中所选的单选按钮没有被正确反射(reflect)。

ConvertBack 应该是:

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

关于c# - RaisePropertyChanged 设置回单选按钮的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26714159/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com