簡體   English   中英

單擊RadioButton,第二個radioButton不會取消標記wpf

[英]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設置器。 因此,如果確實點擊“最終用戶”單選按鈕,則會觸發兩個設置器:

  1. IsEndUser的值為true
  2. IsAppDeveloper的值為false

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM