如何使用Xamarin.Forms处理Prism中的行为

如何使用Xamarin.Forms处理Prism中的行为,xamarin.forms,prism,Xamarin.forms,Prism,如何使用Prism处理行为?我有以下代码,我想知道如何处理“enrtyEmail.IsValid”属性?如何在ViewModel中找到EmailValidator行为的状态 <Entry x:Name="entryEmail"> <Entry.Behaviors> <local:EmailValidatorBehavior /> </Entry.Behaviors> </Entry> 行为是

如何使用Prism处理行为?我有以下代码,我想知道如何处理“enrtyEmail.IsValid”属性?如何在ViewModel中找到EmailValidator行为的状态

<Entry x:Name="entryEmail">  
  <Entry.Behaviors>  
    <local:EmailValidatorBehavior />  
  </Entry.Behaviors>  
</Entry>      

行为是一个BindableObject,因此您可以简单地将BindableProperty添加到您的EmailValidator行为中

public class EmailValidatorBehavior : BehaviorBase<Entry>
{
    public static readonly BindableProperty IsEmailValidProperty =
        BindableProperty.Create( nameof( IsEmailValid ), typeof( bool ), typeof( EmailValidatorBehavior ), false, BindingMode.OneWayToSource );

    public bool IsEmailValid
    {
        get { return (bool)GetValue( IsEmailValidProperty ); }
        set { SetValue( IsEmailValidProperty, value ); }
    }
}
公共类EmailValidatorBehavior:BehaviorBase
{
公共静态只读BindableProperty IsEmailValidProperty=
创建(nameof(IsEmailValid)、typeof(bool)、typeof(EmailValidatorBehavior)、false、BindingMode.OneWayToSource);
公共布尔值有效
{
获取{return(bool)GetValue(IsEmailValidProperty);}
set{SetValue(IsEmailValidProperty,value);}
}
}
然后从ViewModel绑定到该属性

<Entry Text="{Binding EmailAddress}">  
  <Entry.Behaviors>  
    <local:EmailValidatorBehavior IsEmailValid="{Binding IsEmailValid}" />  
  </Entry.Behaviors>  
</Entry> 

编辑:请注意,如果不设置BindingMode,绑定将不会从行为传播到ViewModel。考虑到设置的性质,最合适的绑定模式应该是
OneWayToSource
,因为这使得ViewModel的属性实际上是只读的


有关工作示例,请参见

行为是BindableObject,因此您可以简单地将BindableProperty添加到EmailValidator行为中

public class EmailValidatorBehavior : BehaviorBase<Entry>
{
    public static readonly BindableProperty IsEmailValidProperty =
        BindableProperty.Create( nameof( IsEmailValid ), typeof( bool ), typeof( EmailValidatorBehavior ), false, BindingMode.OneWayToSource );

    public bool IsEmailValid
    {
        get { return (bool)GetValue( IsEmailValidProperty ); }
        set { SetValue( IsEmailValidProperty, value ); }
    }
}
公共类EmailValidatorBehavior:BehaviorBase
{
公共静态只读BindableProperty IsEmailValidProperty=
创建(nameof(IsEmailValid)、typeof(bool)、typeof(EmailValidatorBehavior)、false、BindingMode.OneWayToSource);
公共布尔值有效
{
获取{return(bool)GetValue(IsEmailValidProperty);}
set{SetValue(IsEmailValidProperty,value);}
}
}
然后从ViewModel绑定到该属性

<Entry Text="{Binding EmailAddress}">  
  <Entry.Behaviors>  
    <local:EmailValidatorBehavior IsEmailValid="{Binding IsEmailValid}" />  
  </Entry.Behaviors>  
</Entry> 

编辑:请注意,如果不设置BindingMode,绑定将不会从行为传播到ViewModel。考虑到设置的性质,最合适的绑定模式应该是
OneWayToSource
,因为这使得ViewModel的属性实际上是只读的


请参阅以获取一个工作示例,不幸的是,IsEmailValid属性在我的ViewModel中没有更改状态。在该行为中,我可以看到当电子邮件有效时,“return GetValue”返回true,但在我的ViewModel中IsEmailValid仍然为false@迪米特里斯看到了编辑。您只需要设置BindingMode。我做了更改,但得到了相同的结果。什么都没变!您发布的代码和我的代码之间有2处更改。第一个是我在XAMl绑定中使用了大括号,即(否则会出现编译时错误)IsEmailValid=“{binding IsEmailValid}”;第二个是我在属性return(bool)GetValue(IsEmailValidProperty)中使用了“(bool)”强制转换;(否则我会得到一个编译时错误)是的,很抱歉输入错误。。。看起来您现在已经明白了:)不幸的是,IsEmailValid属性在我的ViewModel中没有更改状态。在行为中,我可以看到当电子邮件有效时“return GetValue”返回true,但在我的ViewModel中IsEmailValid仍然为false@迪米特里斯看到了编辑。您只需要设置BindingMode。我做了更改,但得到了相同的结果。什么都没变!您发布的代码和我的代码之间有2处更改。第一个是我在XAMl绑定中使用了大括号,即(否则会出现编译时错误)IsEmailValid=“{binding IsEmailValid}”;第二个是我在属性return(bool)GetValue(IsEmailValidProperty)中使用了“(bool)”强制转换;(否则我会得到一个编译时错误)是的,很抱歉输入错误。。。看起来你现在已经明白了:)