从 UserControl 访问 Validation.HasError
Access Validation.HasError from UserControl
有人可以帮助我吗,我怎样才能从我的自定义用户控件访问 HasError 属性?
<UserControl.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,2,0,2" />
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="true">
<Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<!--<TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" FontWeight="Bold" Foreground="white">
</TextBlock>-->
</Border>
<AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
<Border BorderBrush="red" BorderThickness="1" />
</AdornedElementPlaceholder>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid x:Name="Layout" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Name="TbHostname" Grid.Column="1"
VerticalContentAlignment="Center" MinWidth="200">
<TextBox.Text>
<Binding Path="Hostname" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
<Binding.ValidationRules>
<serverStarter2:HostnameValidator ErrorMessage="Wrong hostname format."/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
这是我的自定义用户控件,用于 MainWindow.xaml。我想要的是,当一切正常时,启用提交按钮,否则,禁用它。
这是按钮内部的代码 MainWindow.xaml:
<Button Content="Test connection" Command="{Binding ConnectionViewModel.TestConnectionCommand}"
>
<Button.Style>
<Style TargetType="{x:Type Button}" >
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=StudioHostname}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
ElementName=StudioHostname 是我的 UserControl 的名称。
是UserControl
中TextBox
的Validation.HasError
附属性设置为true
。 UserControl
本身的 Validation.HasError
属性 不会被设置,并且您不能绑定到使用 MainWindow
定义的 UserControl
的元素一个 ElementName
.
你做错了。您应该做的是在定义了 Hostname
属性 的视图模型 class 中实现验证。您可以通过实现 INotifyDataErrorInfo 接口来做到这一点。
然后你可以简单地将Button
的IsEnabled
属性绑定到视图模型的HasErrors
属性,或者绑定到一个ICommand
其 CanExecute
方法 returns 的值 HasErrors
属性。
这里有一个如何实现接口的例子:https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx。
有人可以帮助我吗,我怎样才能从我的自定义用户控件访问 HasError 属性?
<UserControl.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,2,0,2" />
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="true">
<Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<!--<TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" FontWeight="Bold" Foreground="white">
</TextBlock>-->
</Border>
<AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
<Border BorderBrush="red" BorderThickness="1" />
</AdornedElementPlaceholder>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid x:Name="Layout" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Name="TbHostname" Grid.Column="1"
VerticalContentAlignment="Center" MinWidth="200">
<TextBox.Text>
<Binding Path="Hostname" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
<Binding.ValidationRules>
<serverStarter2:HostnameValidator ErrorMessage="Wrong hostname format."/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Grid>
这是我的自定义用户控件,用于 MainWindow.xaml。我想要的是,当一切正常时,启用提交按钮,否则,禁用它。
这是按钮内部的代码 MainWindow.xaml:
<Button Content="Test connection" Command="{Binding ConnectionViewModel.TestConnectionCommand}"
>
<Button.Style>
<Style TargetType="{x:Type Button}" >
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=StudioHostname}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
ElementName=StudioHostname 是我的 UserControl 的名称。
是UserControl
中TextBox
的Validation.HasError
附属性设置为true
。 UserControl
本身的 Validation.HasError
属性 不会被设置,并且您不能绑定到使用 MainWindow
定义的 UserControl
的元素一个 ElementName
.
你做错了。您应该做的是在定义了 Hostname
属性 的视图模型 class 中实现验证。您可以通过实现 INotifyDataErrorInfo 接口来做到这一点。
然后你可以简单地将Button
的IsEnabled
属性绑定到视图模型的HasErrors
属性,或者绑定到一个ICommand
其 CanExecute
方法 returns 的值 HasErrors
属性。
这里有一个如何实现接口的例子:https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx。