2017-02-15 4 views
0

У меня есть форма в моем приложении, и я использую поведение для проверки на стороне клиента. Я хочу передать значение в поведение для max Validatior.
Значение хранится в моей модели ViewModel, и я попытался передать значение в поведение, но оно передает ноль в поведение, а не значение. Я пробовал использовать hardcoded значение, и это работает нормально.Параметр прохождения в поведение форм Xamarin

Мой вопрос:
Возможно ли, что свойство ViewModel будет передано в поведение?

XAML:

<Entry Text="{Binding EventSubscription.Attendees, Mode=TwoWay }" WidthRequest="50" x:Name="attendees" > 
            <Entry.Behaviors> 
             <behaviours:NullEntryValidationBehaviour x:Name="GroupValidator"/> 
             <behaviours:MaxAttendeesValidationBehaviour Max="{Binding EventSubscription.RemainingPlaces, Mode=TwoWay}"/> 

            </Entry.Behaviors> 
           </Entry> 

C# Поведение:

public class MaxAttendeesValidationBehaviour : Behavior<Entry> 
{ 

    public static BindableProperty IntProperty = BindableProperty.Create<MaxAttendeesValidationBehaviour, string>(tc => tc.MaxAttendeesAllowed, string.Empty, BindingMode.TwoWay); 

    public string MaxAttendeesAllowed 
    { 
     get 
     { 
      return (string)GetValue(IntProperty); 
     } 

     set 
     { 
      SetValue(IntProperty, value); 
     } 
    } 

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

    void HandleTextChanged(object sender, TextChangedEventArgs e) 
    { 
    bool IsValid = false; 
    if (!string.IsNullOrEmpty(e.NewTextValue)) 
    { 
     IsValid = true;//Int32.Parse(e.NewTextValue) <= MaxAttendeesAllowed; 
    }      
     ((Entry)sender).TextColor = IsValid ? Color.Default : Color.Red; 
    }   
    protected override void OnDetachingFrom(Entry bindable) 
    { 
     bindable.TextChanged -= HandleTextChanged; 
     base.OnDetachingFrom(bindable); 
    } 
} 

ответ

0

Вы можете сделать это следующим образом:

public class MaxValueEntry : Behavior<Entry> 
{ 
    public int Max { get; set; } 

    protected override void OnAttachedTo(Entry entry) 
    { 
     entry.TextChanged += OnEntryTextChanged; 
     base.OnAttachedTo(entry); 
    } 

    protected override void OnDetachingFrom(Entry entry) 
    { 
     entry.TextChanged -= OnEntryTextChanged; 
     base.OnDetachingFrom(entry); 
    } 

    void OnEntryTextChanged(object sender, TextChangedEventArgs args) 
    { 
     if(args.NewTextValue.Length > Max) 
      ((Entry)sender).TextColor = Color.Red; 
     else 
      ((Entry)sender).TextColor = Color.Default; 
    } 
} 

Затем в XAML, вы добавляете параметр, как это:

<Entry> 
    <Entry.Behaviors> 
     <behaviors:MaxValueEntry Max="3"/> 
    </Entry.Behaviors> 
    </Entry> 

Если необходимо связать значение из модели представления, вы должны создать связываемое свойство для Max

как это:

public static readonly BindableProperty MaxProperty = 
BindableProperty.CreateAttached("Max", typeof(int), typeof(MaxValueEntry), 0); 

public int Max 
{ 
    get { return (int)GetValue(MaxProperty); } 
    set { SetValue(MaxProperty, value); } 
} 
+0

той же проблема возникает, когда свойство Bindable всегда 0. Для по какой-то причине свойство не передается поведению – whiskeycoder

Смежные вопросы