从UserControl访问Validation.HasError

时间:2017-10-09 09:53:48

标签: c# wpf xaml user-controls

有人可以帮助我吗,如何从我的自定义用户控件中访问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的名称。

1 个答案:

答案 0 :(得分:0)

Validation.HasError中的TextBox附加属性UserControl被设置为trueValidation.HasError本身的UserControl属性将不会被设置,您无法使用{{1}绑定到UserControlMainWindow定义的元素}}

你做错了。您应该做的是在定义ElementName属性的视图模型类中实现验证。您可以通过实现INotifyDataErrorInfo界面来实现此目的。

然后,您只需将Hostname的{​​{1}}属性绑定到视图模型的IsEnabled属性,或将其绑定到Button HasErrors。 } method返回ICommand属性的值。

有一个如何实现此处可用界面的示例:https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx