Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击单选按钮,第二个单选按钮不';t取消标记wpf_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 单击单选按钮,第二个单选按钮不';t取消标记wpf

C# 单击单选按钮,第二个单选按钮不';t取消标记wpf,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有2个单选按钮,当我选择一个时,我会发送角色的名称 <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=OneWay

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

 <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>
当我选择最终用户时,角色将是和用户

在viewModel中,我编写属性

public AuthRequestModel AuthRequstModel
    {
        get => authRequstModel;
        set => Set(ref authRequstModel, value);
    }
它工作正常,我使用正确的角色名称,但在UI中,当我单击第一个it标记时,当单击第二个it标记时,第一个没有取消标记,这是一个大问题

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

有两种方法可以更正数据,但UI无法正确工作


如何解决此问题?

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

  • 值为true的IsEndUser
  • 值为false的IsAppDeveloper
  • IsAppDeveloper将被第二次解雇,所以在UI上它是可以的,但在数据中角色将被设置为“AppDeveloper”(记住您单击了EndUser)

    第二,当您通知属性更改时,您有一个输入错误,而不是:

    NotifyPropertyChanged("EndUser");
    
    应该是

    NotifyPropertyChanged("IsEndUser");
    
    与AppDeveloper相同的打字错误

    您需要在更改角色属性之前检查值是否为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-to-boolean转换器

    例如:

    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);
        }
    
    }
    
    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>
    

    第一个问题是,当值更改为false时,IsEndUser和IsAppDeveloper设置程序也会启动。因此,如果您确实单击“最终用户”单选按钮,这将启动两个设置程序:

  • 值为true的IsEndUser
  • 值为false的IsAppDeveloper
  • IsAppDeveloper将被第二次解雇,所以在UI上它是可以的,但在数据中角色将被设置为“AppDeveloper”(记住您单击了EndUser)

    第二,当您通知属性更改时,您有一个输入错误,而不是:

    NotifyPropertyChanged("EndUser");
    
    应该是

    NotifyPropertyChanged("IsEndUser");
    
    与AppDeveloper相同的打字错误

    您需要在更改角色属性之前检查值是否为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-to-boolean转换器

    例如:

    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);
        }
    
    }
    
    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>
    

    您的属性
    IsEndUser
    IsAppDeveloper
    在哪里?我只看到了
    EndUser
    AppDeveloper
    !您需要分配一个
    GroupName
    ,参考Chayim Friedman-很抱歉,我在编写时对其进行了重命名,错过了修复问题Funk-谢谢您,我在之前和现在都做了之后尝试了一点,但没有任何帮助,同样的问题你的属性
    IsEndUser
    IsAppDeveloper
    在哪里?我只看到了
    EndUser
    AppDeveloper
    !你需要分配一个
    GroupName
    ,参考Chayim Friedman-很抱歉,我在写的时候重命名了它,但没有修复问题Funk-谢谢你,我在它帮不上忙后尝试了一下以前和现在,同样的问题