다음은 제목을 의미합니다. 입력이 범위 (이 경우 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;
}
}
는 질문에 당신의 행동 논리를 추가합니다. –
@ZiyadGodil 코드가 추가되었습니다. 감사합니다 –
unfocus에 대한 대화 표시 (유효하지 않은 경우)를 원하십니까? –