繁体   English   中英

在 Xamarin Forms 中触发属性更改方法

[英]Fire a method on Property Change in Xamarin Forms

我正在尝试调用属性更改的方法,当收到我的 Fire-base 推送通知时,此属性当前会更改,现在当发生这种情况时,我想触发一个方法,然后显示 DisplayAlert。

为什么? 因为我基本上有闪购,它们从我的 API 中分成一个类别,我可以通过名称获取它们,所以当我创建通知时,我将标题作为名称传递,显示警报会弹出,他们单击确定,然后将其带到那个页面并设置名称我需要获取正确的“闪购”

至少这是我对此的解决方案

到目前为止我的尝试

应用程序


  Myapp.Views.Home mPage;


 CrossFirebasePushNotification.Current.Subscribe("general");
            CrossFirebasePushNotification.Current.OnTokenRefresh += (s, p) =>
            {
                System.Diagnostics.Debug.WriteLine($"TOKEN REC: {p.Token}");
            };
            System.Diagnostics.Debug.WriteLine($"TOKEN: {CrossFirebasePushNotification.Current.Token}");

            CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
            {
                try
                {
                    System.Diagnostics.Debug.WriteLine("Received");
                    if (p.Data.ContainsKey("body"))
                    {
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            mPage.Message = $"{p.Data["body"]}";
                        });

                    }
                }
                catch (Exception ex)
                {

                }
            };
            CrossFirebasePushNotification.Current.OnNotificationOpened += (s, p) =>
            {
                //System.Diagnostics.Debug.WriteLine(p.Identifier);

                System.Diagnostics.Debug.WriteLine("Opened");
                foreach (var data in p.Data)
                {
                    System.Diagnostics.Debug.WriteLine($"{data.Key} : {data.Value}");
                }

                if (!string.IsNullOrEmpty(p.Identifier))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {


                    });
                }
                else if (p.Data.ContainsKey("color"))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        mPage.Navigation.PushAsync(new ContentPage()
                        {
                            BackgroundColor = Color.FromHex($"{p.Data["color"]}")

                        });
                    });

                }
                else if (p.Data.ContainsKey("aps.alert.title"))
                {
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        mPage.TitleMessage = $"{p.Data["aps.alert.title"]}";
                    });

                }
            };

 public string Message
        {
            get
            {

                return Message;
            }
            set
            {
                Message = value;
                RaisePropertyChanged("Message");
            }
        }

        public string TitleMessage
        {
            get
            {

                return TitleMessage;

            }
            set
            {
                TitleMessage = value;
                RaisePropertyChanged("TitleMessage");
            }
        }

        protected void RaisePropertyChanged(string propertyName = "")
        {
            if (PropertyChanged != null)
            {

                App.Current.MainPage.DisplayAlert(TitleMessage, Message, "ok");
            }
        }

“应用程序只是在一段时间后崩溃”可能是因为您试图在 UI 线程之外显示对话框。

if (PropertyChanged != null)
{
    App.Current.MainPage.DisplayAlert(TitleMessage, Message, "ok");
}

在检查了 PropertyChanged 事件的订阅者之后,您需要实际调用事件而不是尝试显示警报。 订阅者的事件处理程序然后可以处理显示警报。

例如

if (PropertyChanged != null)
{
    PropertyChanged.Invoke(this, <your event args>);
}

可以使用 null 条件运算符将其缩短为:

PropertyChanged?.Invoke(this, <your event args>);

然后,处理对话框显示的类可以像这样订阅:

yourInstanceName.PropertyChanged += HandleMyDialog;

如果我理解正确,您可以执行以下操作。 如果 TitleMessage 更改,这将运行 MyMethod:

public string TitleMessage
        {
            get
            {

                return TitleMessage;

            }
            set
            {
                if(TitleMessage != value){
                    TitleMessage = value;
                    RaisePropertyChanged("TitleMessage");
                    MyMethod();
                }

            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM