2017-02-15 5 views
0

私は自分のアプリケーションにフォームを持っており、クライアント側の検証にビヘイビアを使用しています。 最大Validatiorの動作に値を渡したいと思います。
値は私のViewModelに保存されていますが、その値をビヘイビアに渡そうとしましたが、値ではなくビヘイビアに0が渡されました。 ハードコードされた値を使用しようとしましたが、正常に動作します。パラメータを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

バインド可能なプロパティでは常に0になります。どこに同じ問題が発生しますプロパティがビヘイビアに渡されていない何らかの理由 – whiskeycoder

関連する問題