У меня есть проблема с привязкой 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 для поля кнопка отключена
Например, вы можете поместить 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");
}
}
@Andrey: RadioButtons не отмечены. Граница отображается, когда Role == null
. Я не знаю, откуда берется MultiDataTrigger
.
Я редактирую свой вопрос и добавляю код xaml кнопки с помощью MultiDataTrigger
можете ли вы помочь заблокировать кнопку, если роль == null, потому что, если этого не сделать, я могу получить значение null после нажатия
это похоже на решение, но 1. нужно заблокировать кнопку, код для кнопки в MultiDataTrigger `<Condition Binding = "{Binding Path=(Validation.HasError), ElementName=Role}" Value = "False"/>` не работает блок кнопок для всех случаев 2. не помечает красные радиокнопки