Нажмите кнопку RadioButton, и вторая кнопка RadioButton не снимает пометку с wpf. - PullRequest
1 голос
/ 02 июня 2019

У меня есть 2 radioButton, когда я выбираю один, я посылаю имя роли

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

, когда я выбираю конечного пользователя, роль будет и пользователь.

В viewModel я пишу свойство

public AuthRequestModel AuthRequstModel
    {
        get => authRequstModel;
        set => Set(ref authRequstModel, value);
    }

оно работает хорошо, я беру правильное имя роли, но в пользовательском интерфейсе, когда я нажимаю первый раз, он помечается, когдащелкните второй, это помечает, НО первый не снимает отметку, и это большая проблема,

я пробую весь режим (один раз - не отправляет роль, односторонний - не отправляет роль, oneWayToSource -отправить неверную роль (если я щелкаю много раз между ролями, отправляю неверную роль)

два способа исправить данные Но пользовательский интерфейс работает некорректно проблема

Как это исправить?

1 Ответ

0 голосов
/ 03 июня 2019

Первая проблема заключается в том, что установщики IsEndUser и IsAppDeveloper срабатывают также, когда значение изменяется на false.поэтому, если вы нажмете кнопку «Конечный пользователь», это запустит два установщика:

  1. IsEndUser со значением true
  2. IsAppDeveloper со значением false

IsAppDeveloperбудет запущен второй, так что в пользовательском интерфейсе все будет в порядке, но в данных для Role будет задано значение «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");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...