2017-10-08 57 views
1

驗證部分對話框/禁用按鈕 `如何啓用取決於驗證

Imports System.Globalization 
Namespace Validation 
Public Class ISBNLength 
      Inherits ValidationRule 
     Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult 
     If value.ToString.Trim.Length = 10 
         Return New ValidationResult(True,"") 
       Else 
      Return New ValidationResult(False,"Must be a 10 digit number") 
     End If    
     End Function 
End Class 
    End Namespace 

**XAML**

<materialDesign:PackIcon Kind="BarcodeScan" 
           Grid.Row="1" Margin="0,0,16,10" /> 
     <TextBox x:Name="TxtISBN" 
       Grid.Row="1" 
       materialDesign:HintAssist.Hint="ISBN Number" MaxLength="10" > 
      <TextBox.Text> 
       <Binding ElementName="TxtISBN" Path="Text" UpdateSourceTrigger="LostFocus"> 
        <Binding.ValidationRules> 
         <validation:NotEmpty/> 
         <validation:ISBNLength/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 

     </TextBox> 

      <Button 
       x:Name="BtnAccept" 
       IsDefault="True" 
       Command="materialDesign:DialogHost.CloseDialogCommand" 
       Content="ADD" 
       IsEnabled="False" 
       Height="36" Width="90" /> 

現在我想,如果函數返回false禁用按鈕。

注意:我無法在不創建新實例的情況下訪問對話框。

回答

1

你可以使用一個StyleDataTrigger結合的的Validation.HasError附加屬性TextBox

<Button 
    x:Name="BtnAccept" 
    IsDefault="True" 
    Command="materialDesign:DialogHost.CloseDialogCommand" 
    Content="ADD" 
    Height="36" Width="90"> 
    <Button.Style> 
     <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=TxtISBN}" Value="True"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

還要注意的是TextBox應綁定到一個源屬性。它不能綁定到自己的Text財產。

+0

非常感謝你,你能解釋一下什麼是一個源屬性,因爲我的驗證在這件事上可以正常工作。另外請注意我沒有使用MVVM archicture。 –

+0

你試試我的示例代碼?它工作嗎? – mm8

+0

它工作!謝謝! –

0

綁定Button`s啓用可輸入文本並使用值轉換器:(無VB,抱歉)

public static class Extensions 
{ 
    public static bool IsIsbn(this string s) 
    { 
     if ((s?.Trim() ?? "") is string isbn) 
      return s.Length == 10 /* && whatever */ ; 

     return false; 
    } 
} 

public class ValidIsbnToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is string s) 
      return s.IsIsbn(); 

     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     => throw new NotImplementedException(); 
} 

public class ValidationRuleIsbn : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     return ((value as string)?.IsIsbn() ?? false) 
      ? ValidationResult.ValidResult 
      : new ValidationResult(false, "Must be a 10 digit number"); 
    } 
} 
+0

非常感謝你,帕特里克 - 事情是我能夠得到錯誤字段。唯一的事情是我不能夠到按鈕與文本框validation.HasErrors東西綁定。如果你能幫我解決這個問題真是太好了。 –