首页 > 解决方案 > 如何根据其他 ViewModel 中设置的设置动态更新一个 ViewModel 中的属性?

问题描述

我的 ViewModel #1 中有这个

public bool IsThereAProperty
{
    get
    {
        return App.Current.Properties.ContainsKey("myKey");
    }
}

在我看来,我从这个属性绑定。我该如何更新它,以便如果我向 App.Current.Properties(在其他 ViewModels 中)添加一个键,那么这个 ViewModel #1 和我的视图中的更改也会受到尊重?

标签: c#androidformsxamarin

解决方案


我认为ViewModel中的属性不会动态更新,通过App.Current.Properties是全局属性,如果你在其他ViewModel中添加一个键App.Current.Properties,全局属性会改变,但是你IsThereAPropertyViewModel中的属性不会,因为它只是属性你的视图模型,所以你应该通知你的视图模型更新IsThereAProperty,然后它会更新绑定的视图。

当您在另一个视图模型中添加键时,您可以使用MessagingCenter通知视图模型。

例如,在 viewmodel#2 中,您添加一个密钥并删除该密钥:

if (!App.Current.Properties.ContainsKey("myKey"))
  {
    App.Current.Properties.Add("myKey", true);
    MessagingCenter.Send<string, bool>("change", "add a key", App.Current.Properties.ContainsKey("myKey"));

  }
else
  {
    App.Current.Properties.Remove("myKey");
    MessagingCenter.Send<string, bool>("change", "add a key", App.Current.Properties.ContainsKey("myKey"));
  }         

然后在你的viewmodel#1中:

public class Model1 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public bool isIsThereAProperty;
    public bool IsIsThereAProperty
    {
        set
        {

           isIsThereAProperty = App.Current.Properties.ContainsKey("myKey");
           OnPropertyChanged("IsIsThereAProperty");

        }
        get
        {
            return App.Current.Properties.ContainsKey("myKey");
        }
    }

    public Model1()
    {
        MessagingCenter.Subscribe<string>("change","add a key" ,(sender)=>
        {

            OnPropertyChanged("IsIsThereAProperty");

        });
    }
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}   

推荐阅读