C# 单击单选按钮,第二个单选按钮不';t取消标记wpf
我有2个单选按钮,当我选择一个时,我会发送角色的名称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
<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设置程序也会启动。因此,如果您确实单击“最终用户”单选按钮,则会启动两个设置程序:
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设置程序也会启动。因此,如果您确实单击“最终用户”单选按钮,这将启动两个设置程序:
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-谢谢你,我在它帮不上忙后尝试了一下以前和现在,同样的问题