2017-10-09 1 views
0

私のカスタムコントロールからHasErrorプロパティにアクセスするにはどうすればよいですか?UserControlからのAccess Validation.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の名前です。

答えて

0

UserControlののValidation.HasError添付プロパティがtrueに設定されています。 UserControl自体のValidation.HasErrorプロパティは設定されません。MainWindowからUserControlに定義された要素には、ElementNameを使用してバインドすることはできません。

これは間違っています。何をすべきかは、Hostnameプロパティが定義されているビューモデルクラスで検証を実装することです。これを行うには、INotifyDataErrorInfoインターフェイスを実装します。

次に、あなたは、単にビューモデルのHasErrorsプロパティにButtonIsEnabledプロパティをバインド、またはそのCanExecute方法HasErrorsプロパティの値を返しますICommandにバインドすることができます。

ここで使用できるインターフェイスの実装方法の例があります:https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx

+0

あなたの答えをありがとう、私はそれを試してみます – JurajPupak

+0

私は少し混乱しています。私のusercontrolのために私はVMを持っていません。ホスト名はdependencypropertyです。 INOFityDataErrorInfoからUserControlを継承し、インターフェイスを実装する必要がありますか? – JurajPupak

+0

その場合、はい。 UserControlはインターフェイスを実装する必要があります。その後、UserControlのHasErrorsプロパティにバインドできます。 – mm8

関連する問題