2017-11-20 9 views
0

다음은 제목을 의미합니다. 입력이 범위 (이 경우 0-10)에 있는지 확인하고 항목의 배경색을 빨간색으로 지정하는 동작 (유효성 검사기라고 함)에 바인딩 된 "IsValid"(부울) 속성이있는 항목이 있습니다. 또는 투명. 그건 잘 작동합니다. 그러나, 내 ViewModel (입력이 범위 내에 있는지 확인)에 동일한 논리가 있고 대화 상자가 아닌 경우 대화 상자 메시지가 표시되므로 유효성 검사기의 IsValid에 직접 바인딩하고 내 viewModel에서 bindd를 사용하려고했습니다 (IsBinReferenceValid) abd는 VM에서 locig를 제거합니다. 현재 내 VM IsBinReferenceValid의 속성은 바인딩이 작동하지 않는다는 것을 나타내는 방식으로 변경되지 않습니다. 여기 동시에 속성을 참조하고 바인딩하는 방법은 무엇입니까?

는 XAML 코드 :

<userControl:DetailedEntry 
      PlaceholderLabel="{x:Static locale:BinPrintLang.BinRef}" 
      Text="{Binding BinTextEntry}" 
      TextColor="{StaticResource PrimaryColor}" 
      BgColor="White" 
      BorderColor="{StaticResource DisableColor}" 
      VerticalOptions="CenterAndExpand" 
      IsLabelVisible="True" 
      Label="Bin Reference" 
      IsImportant="True" 
      IsValid="{Binding Source={x:Reference InputLengthValidator}, Path=IsValid}"> 
      <userControl:DetailedEntry.EntryBehavior> 
       <ui:InputLengthValidator x:Name="InputLengthValidator" 
             MinValue="0" 
             MaxValue="10" 
             IsValid="{Binding Source=IsBinReferenceValid, Mode=OneWayToSource}"/> 
      </userControl:DetailedEntry.EntryBehavior> 
     </userControl:DetailedEntry> 

I는, 참조하고 동시에 속성에 바인딩 할 수 있습니다 모든 아이디어를 어떻게 그 (문제가 어디에서 오는 그 경우 즉,도 가능)?

자료 검증 코드 :

public class ValueInRangeValidator : Validator<Entry> 
{ 
    private static BindableProperty MinValueProperty = 
     BindableProperty.Create("MinValue", typeof(decimal?), typeof(ValueInRangeValidator)); 

    public decimal? MinValue 
    { 
     get { return (decimal?) GetValue(MinValueProperty); } 
     set 
     { 
      SetValue(MinValueProperty, value); 
      OnPropertyChanged(); 
     } 
    } 

    public static BindableProperty MaxValueProperty = 
     BindableProperty.Create("MaxValue", typeof(decimal?), typeof(ValueInRangeValidator)); 

    public decimal? MaxValue 
    { 
     get { return (decimal?) GetValue(MaxValueProperty); } 
     set 
     { 
      SetValue(MaxValueProperty, value); 
      OnPropertyChanged(); 
     } 
    } 


    public virtual void Bindable_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     decimal i = 0; 
     IsValid = decimal.TryParse(e.NewTextValue, out i); 

     IsValid = IsValid && (MinValue == null ? i >= decimal.MinValue : i >= MinValue); 
     IsValid = IsValid && (MaxValue == null ? i <= decimal.MaxValue : i <= MaxValue); 
    } 

    protected override void OnAttachedTo(Entry bindable) 
    { 
     bindable.TextChanged += Bindable_TextChanged; 
    } 

    protected override void OnDetachingFrom(Entry bindable) 
    { 
     bindable.TextChanged -= Bindable_TextChanged; 
    } 
} 

InputLengthValidator 코드 :

public class InputLengthValidator : ValueInRangeValidator 
{ 

    public override void Bindable_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     var max = (int) MaxValue; 
     var min = (int) MinValue; 
     var textLenght = e.NewTextValue.Length; 
     IsValid = textLenght >= min && textLenght < max; 
    } 
} 
+1

는 질문에 당신의 행동 논리를 추가합니다. –

+0

@ZiyadGodil 코드가 추가되었습니다. 감사합니다 –

+0

unfocus에 대한 대화 표시 (유효하지 않은 경우)를 원하십니까? –

답변

0

나는 나의 DetailedEntry 제어의 또 다른 (사용자 정의) 바인딩 속성에 가입하여 작업 검증을 얻을 수 있었다을 IsWarning 을했다.

<userControl:DetailedEntry 
rid.Row="1" 
Grid.Column="0" 
Label="{x:Static locale:GoodsReceiptLang.NumLabels}" 
Text="{Binding NumberOfLabels, Mode=TwoWay}" 
TextColor="{StaticResource PrimaryColor}" 
Keyboard="Numeric" 
IsImportant="True" 
IsWarning="{Binding ShowWarning}"> 
</userControl:DetailedEntry> 

내 VM은 :

private bool CanPrint() 
    { 
     var errors = new List<string>(); 

     ShowWarning = false; 

     if (SelectedPrinter == null) 
      errors.Add(CommonLang.SelectPrinterErrorMsg); 

     if (string.IsNullOrEmpty(NumberOfLabels) || !int.TryParse(NumberOfLabels, out int numLabels)) 
     { 
      ShowWarning = true; 
      errors.Add(CommonLang.NotValidInput); 
     } 

     if (errors.Any()) 
     { 
      ShowErrorMessage(string.Join(" ", errors.ToArray())); 
      return false; 
     } 

     return true; 
    } 
관련 문제