C#-Xamarin.Forms-依赖关系服务和事件

时间:2018-11-20 21:49:24

标签: c# events xamarin.forms xamarin.android

我想从实现接口MyClass的类IMyInterface引发的PropertyChanged事件中得到通知。此类的实例使用DependencyService.Get<IMyInterface>();

检索

现在,这是类(Android项目),其中有一个带有后备字段的属性:

class MyClass : IMyInterface {

    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        private set { _isEnabled = value; OnPropertyChanged("IsEnabled"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    public void OnSomethingHappens() { //This method is called when something particular happens
        /* Some code... */
        IsEnabled = true; //The point where the property is changed
        /* ...some other code */
    }
}

界面(Forms项目)如下:

public interface IMyInterface : INotifyPropertyChanged
{
    /* code relating the interface */
}

此接口正在实现INotifyPropertyChanged,以便可以侦听属性更改(如上类所示)。到目前为止,一切都很好。

问题是,在我的Forms项目中,当我向此注册事件处理程序时:

_myService = DependencyService.Get<IMyInterface>();
_myService.PropertyChanged += (sender, e) => { /* do stuff */ };

但是当我实现的类中的属性更改时,PropertyChanged的结果为null,这意味着该事件永远不会触发。

我想补充一点:最近,我发现使用DependencyService.Get<IMyInterface>().MyList访问非静态列表属性是没有用的,因为MyList的大小为0,即使此列表已填充在实现类中。我使用静态属性解决了这个问题。也许与上面的问题有关。

为了使此PropertyChanged事件正常运行,我想了解自己在做什么。

1 个答案:

答案 0 :(得分:0)

好的,我想出了解决办法。 基本上,我创建了一个具有private static event支持字段的属性,如下所示:

private static event PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
    get { return _propertyChanged; }
    set { _propertyChanged = value; }
}

这样,我可以使以下代码正常工作:

protected void OnPropertyChanged(string name)
{
    _propertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

实际上,_propertyChanged不再是null,因为我通过以下代码订阅了该活动(与我在问题上发布的代码完全相同,区别在于我使用了{{1 }}属性以私有静态字段PropertyChanged为后盾:

_propertyChanged

现在我认为这是有必要的,因为我正在使用_myService = DependencyService.Get<IMyInterface>(); _myService.PropertyChanged += (sender, e) => { /* do stuff */ }; ,否则,在普通代码中,这个问题就不会出现。 无论如何,我猜测用DependencyService字段支持EventHandler属性的想法是一种好的代码实践还是听起来很奇怪。但这有效,而且效果很好。

但是,为了完成所有这些操作,我必须更改此设置:

private static event

对此:

public interface IMyInterface : INotifyPropertyChanged
{
    /* code relating the interface */
}

我必须在public interface IMyInterface { PropertyChangedEventHandler PropertyChanged { get; set; } /* code relating the interface */ } 中添加该属性,以便可以从Forms项目代码中访问它。 而且,我不再实现IMyInterface,因为INotifyPropertyChanged要求我使用以下命令实现接口:

INotifyPropertyChanged

在我的实现类内部,但是我用

替换了它
public event PropertyChangedEventHandler PropertyChanged

就像我上面暴露的那样。