单击RadioButton,第二个radioButton不会取消标记wpf

时间:2019-06-02 12:18:05

标签: c# wpf xaml mvvm

我有2个单选按钮,当我选择一个时,我会发送角色的名称

Text

在我写的属性中,

 <StackPanel Grid.Column="2" Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,10,0,0">
        <RadioButton x:Name="UserRadioButton" IsChecked="{Binding AuthRequstModel.IsEndUser, Mode=OneWayToSource}" Content="End User" />
        <RadioButton x:Name="DeveloperRadioButton" IsChecked="{Binding AuthRequstModel.IsAppDeveloper, Mode=OneWayToSource}" Margin="15,0,0,0" Content="App Developer"/>
    </StackPanel>

当我选择最终用户时,角色将是and user。

在viewModel中,我编写属性

 public string Role
    {
        get => role;
        private set
        {
            role = value;
            NotifyPropertyChanged("Role");
        }
    }

    public bool IsEndUser
    {
        get => Role == "EndUser";
        set
        {
            Role = "EndUser";
            NotifyPropertyChanged("EndUser");
        }
    }

    public bool IsAppDeveloper
    {
        get => Role == "AppDeveloper";
        set
        {
            Role = "AppDeveloper";
            NotifyPropertyChanged("AppDeveloper");
        }
    }

工作正常,我使用了正确的角色名称,但是在UI中,当我单击第一个标记时,在单击第二个标记时,第一个没有取消标记,这是一个大问题,

我尝试所有模式(一次-不发送角色,单向-不发送角色,oneWayToSource-发送不正确的角色(如果我单击两次角色之间的多次,则发送错误的角色)

两种方式纠正数据,但UI无法正常工作problem

该如何解决?

1 个答案:

答案 0 :(得分:0)

第一个问题是,当值更改为false时,也会触发IsEndUser和IsAppDeveloper设置程序。因此,如果您点击“最终用户”单选按钮,则会触发两个设置器:

  1. IsEndUser,值为true
  2. 值为Isfalse的IsAppDeveloper

IsAppDeveloper将被第二次触发,因此在UI上可以,但是在数据角色中将设置为“ AppDeveloper”(记住您单击EndUser);

第二次通知属性更改时输入错误,而不是:

NotifyPropertyChanged("EndUser");

应该是

NotifyPropertyChanged("IsEndUser");

与AppDeveloper相同的错字

您需要在更改Role属性之前检查值是否为true,并在调用NotifyPropertyChanged时修正拼写错误:

   public bool IsEndUser
    {
        get => Role == "EndUser";
        set
        {
            if(value)
              Role = "EndUser";
            NotifyPropertyChanged("IsEndUser");
        }
    }

    public bool IsAppDeveloper
    {
        get => Role == "AppDeveloper";
        set
        {
            if(value)
               Role = "AppDeveloper";
            NotifyPropertyChanged("IsAppDeveloper");
        }

以下是您可能不需要的其他答案。

更好的解决方案可能是使用enum和enum到布尔转换器。

例如:

EnumToBooleanConverter类:

public class EnumToBooleanConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter as string;
        if (parameterString == null || value == null)
            return DependencyProperty.UnsetValue;

        if (Enum.IsDefined(value.GetType(), value) == false)
            return DependencyProperty.UnsetValue;

        object parameterValue = Enum.Parse(value.GetType(), parameterString);

        return parameterValue.Equals(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string parameterString = parameter as string;
        if (parameterString == null)
            return DependencyProperty.UnsetValue;

        var enumTargetType = targetType;

        if (targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumTargetType = targetType.GetGenericArguments().First();
        }

        return Enum.Parse(enumTargetType, parameterString);
    }

}

一个枚举:

public enum Role { EndUser, AppDeveloper }

更改xaml:

<StackPanel Grid.Column="2" Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,10,0,0">
    <RadioButton IsChecked="{Binding Path=AuthRequstModel.Role, Converter={StaticResource enumBooleanConverter}, ConverterParameter=EndUser}" Content="End User" />
    <RadioButton IsChecked="{Binding Path=AuthRequstModel.Role, Converter={StaticResource enumBooleanConverter}, ConverterParameter=AppDeveloper}" Margin="15,0,0,0" Content="App Developer"/>
</StackPanel>

更改视图模型:

private Role role;
public Role Role
    {
        get => role;
        set
        {
            role = value;
            NotifyPropertyChanged("Role");
        }
    }