Как связать валидацию с RadioButton WPF - PullRequest
0 голосов
/ 28 мая 2019

У меня есть некоторые проблемы с привязкой Radiobutton, чтобы показать валидацию.

Я создаю два RadioButtons

<StackPanel Grid.Column="2" Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,13,0,0">
    <RadioButton IsChecked="{Binding EndUser, Mode=TwoWay}" Content="End User" />
    <RadioButton IsChecked="{Binding AppDeveloper, Mode=TwoWay}" Margin="15,0,0,0" Content="App Developer"/>
</StackPanel>

для своей логики я должен взять 1 имя из 2.

Я пишу логику

[Required]
    public string Role
    {
        get => role;
        set
        {
            Set(ref role, value);
            RaisePropertyChanged("EndUser");
            RaisePropertyChanged("AppDeveloper");
        }
    }

    public bool EndUser
    {
        get => Role.Contains("EndUser");
        set => Role = "EndUser";
    }

    public bool AppDeveloper
    {
        get => Role.Contains("AppDeveloper");
        set => Role = "AppDeveloper";
    }

, проблема в том, как показать [Required] в форме, и если я выберу 1 из них, проверка будет истинной (проверка правильности работает, если это необходимо, я показываюкод проверки)

Я нахожу это Правило проверки для радио кнопок wpf , но этот пример не работает для меня, сломал всю логику (ничего не отправляет мне) и не 'пометить мое поле.

как написать

 <Binding.ValidationRules>
     <DataErrorValidationRule />
 </Binding.ValidationRules>

для полей радиокнопок, как в TextBox, и пометить его красным?

моя кнопка, которая отключается, если поля недействительны

<Button x:Name="SignInButton" Command="{Binding SignInCommand}" Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2"  Content="Sign In" >
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="MidnightBlue"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="FontSize" Value="16"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="Width" Value="100"/>
                <Setter Property="Height" Value="40"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border Background="{TemplateBinding Background}" CornerRadius="10">
                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Height="23" Margin="24,5,24,4"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="IsEnabled" Value="False"/>
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=(Validation.HasError), ElementName=Password}" Value="False"/>
                            <Condition Binding="{Binding Path=(Validation.HasError), ElementName=Login}" Value="False"/>
                            <Condition Binding="{Binding Path=(Validation.HasError), ElementName=Role}" Value="False"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="IsEnabled" Value="True"/>
                    </MultiDataTrigger>

                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="#FF280895"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

в MultiDataTrigger я пишу правило, если Validation.HasError для поля кнопка отключена

1 Ответ

0 голосов
/ 28 мая 2019

Например, вы можете поместить Border вокруг RadioButtons и использовать Style с DataTrigger, который связывается со свойством Role:

<Border Grid.Column="2" Grid.Row="1" BorderBrush="Red" Margin="0,13,0,0">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
        <RadioButton IsChecked="{Binding EndUser, Mode=TwoWay}" Content="End User" />
        <RadioButton IsChecked="{Binding AppDeveloper, Mode=TwoWay}" Margin="15,0,0,0" Content="App Developer"/>
    </StackPanel>
    <Border.Style>
        <Style TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Role}" Value="{x:Null}">
                    <Setter Property="BorderThickness" Value="1" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

Затем вы должны сделатьустановщик приватной роли и обязательно вызовите событие PropertyChanged для соответствующих свойств:

private string role;
[Required]
public string Role
{
    get => role;
    private set
    {
        role = value;
        RaisePropertyChanged("Role");
    }
}

public bool EndUser
{
    get => Role == "EndUser";
    set
    {
        Role = "EndUser";
        RaisePropertyChanged("EndUser");
        RaisePropertyChanged("AppDeveloper");
    }
}

public bool AppDeveloper
{
    get => Role == "AppDeveloper";
    set
    {
        Role = "AppDeveloper";
        RaisePropertyChanged("AppDeveloper");
        RaisePropertyChanged("EndUser");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...