[英]Click RadioButton and second radioButton doesn't unmark wpf
我有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>
鑒於我寫的屬性,
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");
}
}
當我選擇最終用戶時,角色將是and user。
在viewModel中,我編寫屬性
public AuthRequestModel AuthRequstModel
{
get => authRequstModel;
set => Set(ref authRequstModel, value);
}
它可以正常工作,我使用了正確的角色名稱,但是在UI中,當我單擊第一個標記時,單擊第二個標記,但是第一個沒有取消標記,這是一個大問題,
我嘗試所有模式(一次-不發送角色,單向-不發送角色,oneWayToSource-發送不正確的角色(如果我單擊兩次角色之間的多次,則發送錯誤的角色)
兩種方法正確的數據,但UI工作uncorrectly 問題
如何解決?
第一個問題是,當值更改為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");
}
以下是您可能不需要的其他答案。
更好的解決方案可能是使用枚舉和枚舉到布爾轉換器。
例如:
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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.