Xaml 单击“我的”按钮后更改自定义输入的颜色

Xaml 单击“我的”按钮后更改自定义输入的颜色,xaml,xamarin.forms,Xaml,Xamarin.forms,我正在使用custon entry rendered,当我单击按钮时,我需要在自定义渲染中听到xaml的声音 我的xaml中有这个代码 <local:MyEntry eventRefresh="true"> 但是我的入口听不到变化 protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { base.OnElementChanged(

我正在使用custon entry rendered,当我单击按钮时,我需要在自定义渲染中听到xaml的声音

我的xaml中有这个代码

<local:MyEntry   eventRefresh="true">
但是我的入口听不到变化

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                var element = Element as MyEntry;               
protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
var元素=作为MyEntry的元素;

使您的视图模型如下。

public class YourViewModel

  {
    public Command command
    {
        get
        {
            return new Command(() => {

               //Change here button background colors
               BackgroundColor = Color.Green; 
            });
        }
    }


    private _backgroundColor = Color.White;
    public Color BackgroundColor
    {
        get { return _backgroundColor;}
        set
        {
             if (value == _backgroundColor)
                 return;

             _backgroundColor = value;
             NotifyOnPropertyChanged(nameof(BackgroundColor));
         }

}
}

您的XAML

 <local:MyEntry Text="{Binding Password}" Placeholder="Enter"  />

<Button Text="send" Command="{Binding command}" BackgroundColor="{Binding BackgroundColor}"></Button>

您应该将属性eventRefresh定义为可绑定属性

在您的自定义条目中 在xaml中 在自定义渲染器中

使用系统组件模型;
使用Android.Content;
使用xxx;
使用xxx.Droid;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
[程序集:ExportRenderer(typeof(MyEntry)、typeof(NyEntryRenderer))]
名称空间xxx.Droid
{
公共类nEntryRenderer:EntryRenderer
{
公共NyEntryRenderer(上下文):基本(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
Element.TextChanged+=元素_TextChanged;
}
}
私有void元素_TextChanged(对象发送方,textchangedventargs e)
{
//var content=Element.Text;
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
if(e.PropertyName==MyEntry.BackgroundColorProperty.PropertyName)
{
//将在单击按钮时调用
}
}
}
}

显然您不能,因为这不是工作原理,您必须将属性绑定到颜色属性,然后更改绑定中的值,这将反过来进行更改!@FreakyAli您可以创建您的答案吗please@FreakyAli请帮帮我!!!为什么要在自定义条目中创建eventRefresh?以便可以在视图中绑定它请帮我拿一下
 <local:MyEntry Text="{Binding Password}" Placeholder="Enter"  />

<Button Text="send" Command="{Binding command}" BackgroundColor="{Binding BackgroundColor}"></Button>
using System;

using System.ComponentModel;
using System.Runtime.CompilerServices;

using Xamarin.Forms;
namespace xxx
{
    public class MyEntry:Entry,INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public static readonly BindableProperty eventRefreshProperty = BindableProperty.Create("eventRefresh", typeof(bool), typeof(MyEntry), true,propertyChanged:(obj,oldValue,newValue)=> {

            //var entry = obj as MyEntry;

          //  entry.Text = newValue.ToString();


        });

        bool refresh;
        public bool eventRefresh
        {
            get { return refresh; }
            set {
                  if(refresh !=value)
                  {
                    refresh = value;
                    NotifyPropertyChanged("eventRefresh");
                  }

              }
        }



        public MyEntry()
        {

        }



    }
}

<StackLayout  VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">


   <local:MyEntry eventRefresh="{Binding Refresh}" BackgroundColor="{Binding BGcolor}" WidthRequest="200" HeightRequest="50" />

   <Button Command="{Binding ClickCommand}"  />


</StackLayout>

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    Color color;
    public Color BGcolor
    {
        get { return color; }

        set
        {

            if (color != value)
            {
                color = value;
                NotifyPropertyChanged("BGcolor");
            }

        }
    }


    bool refresh;


    public bool Refresh
    {
        get { return refresh; }
        set
        {
            if (refresh != value)
            {
                refresh = value;
                NotifyPropertyChanged("Refresh");
            }

        }
    }



    public ICommand ClickCommand { get; set; }

    public MyViewModel()
    {
        BGcolor = Color.LightPink;


        ClickCommand = new Command(()=> {


            BGcolor = Color.Red;

        });


    }



}

using System.ComponentModel;
using Android.Content;

using xxx;
using xxx.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly:ExportRenderer(typeof(MyEntry),typeof(NyEntryRenderer))]
namespace xxx.Droid
{
    public class NyEntryRenderer : EntryRenderer
    {
        public NyEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if(Control!=null)
            {
                Element.TextChanged += Element_TextChanged;
            }

        }

        private void Element_TextChanged(object sender, TextChangedEventArgs e)
        {
            // var content = Element.Text;
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == MyEntry.BackgroundColorProperty.PropertyName)
            {
                //  will been invoked when click button
            }


        }
    }
}