我有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
该如何解决?
答案 0 :(得分:0)
第一个问题是,当值更改为false时,也会触发IsEndUser和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");
}
}