2016-05-10 2 views
3

Мне нужно знать, как я могу получить доступ к своей модели представления свойства IsValid этих поведений.Лучшее поведение и достоверность Xamarin Foms

Я бы предпочел, чтобы вы сказали мне более надежное поведение, потому что они сделаны с нуля, я хотел бы сделать более надежную проверку с некоторым пакетом nuget, который уже был усовершенствован, несмотря на то, что он был новым для Xamarin Forms.

Это мое поведение, но я не могу получить доступ к свойству «IsValid» мой ViewModel:

public class MesesTrabalhadosValidatorBehavior : Behavior<Entry> 
     { 
      private static readonly BindablePropertyKey IsValidPropertyKey = BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(MesesTrabalhadosValidatorBehavior), false); 

      public static readonly BindableProperty IsValidProperty = IsValidPropertyKey.BindableProperty; 

      public bool IsValid 
      { 
       get { return (bool)base.GetValue(IsValidProperty); } 
       private set { base.SetValue(IsValidPropertyKey, value); } 
      } 

      private void bindable_TextChanged(object sender, TextChangedEventArgs e) 
      { 
       double result; 
       double.TryParse(e.NewTextValue, out result); 
       IsValid = result > 0; 

       ((Entry)sender).TextColor = IsValid ? Color.Green : Color.Red; 
      } 

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

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

Мое мнение:

<Entry Placeholder="Mêses trabalhados" Text="{Binding MesesTrabalhados}" Keyboard="Numeric"> 
      <Entry.Behaviors> 
      <local:MesesTrabalhadosValidatorBehavior /> 
      </Entry.Behaviors> 
     </Entry> 

     <Entry Placeholder="Último salário" Text="{Binding Salario}" Keyboard="Numeric"> 
      <Entry.Behaviors> 
      <local:SalarioValidatorBehavior /> 
      </Entry.Behaviors> 
     </Entry> 

    <ContentView Padding="0,20,0,0"> 
     <Button Text="Calcular" HorizontalOptions="Fill" IsEnabled="{Binding IsValid}" Command="{Binding CalcularFgtsCommand, Mode=TwoWay}"/> 
    </ContentView> 
+0

Я не уверен на 100%, но это больше похоже на вопрос об обзоре кода для проверки кода, чем что-либо еще. –

ответ

2

Вам нужно добавить параметр, мое предпочтение является , так что вы можете вызвать его, когда он достигнет определенных условий. например

<local:SalarioValidatorBehavior Command="{Binding MyCommandInViewModel}" /> 

Тогда связанное свойство в поведении.

public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(TextChangedBehavior), null); 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    void OnEntryTextChanged(object sender, TextChangedEventArgs args) 
    { 
     if (Command != null) 
      Command.Execute(null); 
    } 

или вы можете использовать IsValid свойство в поведении, а затем связать, что обратно в собственность в вашей ViewModel.

<local:SalarioValidatorBehavior IsValid="{Binding IsValid, Mode=TwoWay}" /> 
+0

Моя команда должна быть активирована нажатием кнопки, она привязана для этой команды. Если я прав, ответ ответит автоматически, но это не то, что я хочу. Вы знаете, как исправить? Вы можете изменить ответ, как только придете на работу. Я тестирую изменение. –

+0

Я обновил вопрос своей кнопкой –

+0

@LuizNegrini - попробуйте двухстороннюю привязку к свойству IsValid, как показано выше. –

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