其他分享
首页 > 其他分享> > 通过INotifyPropertyChanged的MvvmCross自定义绑定

通过INotifyPropertyChanged的MvvmCross自定义绑定

作者:互联网

我遇到的情况与this类似,但在Touch中.尝试通过INotifyPropertyChanged处理.

我的代码如下:

set.Bind(txtSearch).For(x => x.Text).To(x => x.SearchText);

其中txtSearch是我的UISearchBar自定义包装.因此,我不能从MvxNotifyPropertyChanged继承,因为我已经从UIView继承(包装器是view).

文字属性为:

 public string Text { get
    {
        return _search.Text;
    } set
    {
        _search.Text = value;
        RaisePropertyChanged(() => Text);
    }
}

然后在SearchBar文本更改(有效)上触发它.

我还添加了以下内容:

    public event PropertyChangedEventHandler PropertyChanged;

    protected IMvxMainThreadDispatcher Dispatcher
    {
        get { return MvxMainThreadDispatcher.Instance; }
    }

    protected void InvokeOnMainThread(Action action)
    {
        if (Dispatcher != null)
            Dispatcher.RequestMainThreadAction(action);
    }
    protected void RaisePropertyChanged<T>(Expression<Func<T>> property)
    {
        var name = this.GetPropertyNameFromExpression(property);
        RaisePropertyChanged(name);
    }

    protected void RaisePropertyChanged(string whichProperty)
    {
        var changedArgs = new PropertyChangedEventArgs(whichProperty);
        RaisePropertyChanged(changedArgs);
    }

    protected void RaisePropertyChanged(PropertyChangedEventArgs changedArgs)
    {
        // check for subscription before going multithreaded
        if (PropertyChanged == null)
            return;

        InvokeOnMainThread(
            () =>
            {
                var handler = PropertyChanged;

                if (handler != null)
                    handler(this, changedArgs);
            });
    }

但是当一切都变为RaisePropertyChanged时,我看到PropertyChanged为空(因此,似乎没有代码订阅我的对象).当然,它不会进一步发出通知.

我有类似的情况,但是有些对象直接从MvxNotifyPropertyChanged继承,看起来工作正常.这是否意味着MvvmCross仅可以处理此类对象,而不能处理通常使用INotifyPropertyChanged的对象?

谢谢!

解决方法:

INotifyPropertyChanged在ViewModel端用于属性更改.

在视图方面,MvvmCross在Windows上使用DependencyProperty绑定,在Xamarin平台上使用C#方法,属性和事件.

View端默认不提供INotifyPropertyChanged-由于没有现成的View对象支持INotifyPropertyChanged,因此在任何MvvmCross View平台中尝试将其绑定都是没有意义的.

但是,绑定系统是可扩展的-因此,如果有人想编写基于INotifyPropertyChanged的视图,并希望为View端添加自定义INotifyPropertyChanged绑定,那么他们可以按照类似于In MvvmCross how do I do custom bind properties的步骤以及以下从https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross链接的示例进行操作

如果他们想为View端编写一个基于INotifyPropertyChanged的系统,那么我敢肯定,可以使用自定义绑定方法来实现-但这不是我个人所做的.我希望这样的自定义绑定对INotifyPropertyChanged和MvxNotifyPropertyChanged也都有效(因为MvxNotifyPropertyChanged实现了INotifyPropertyChanged)-但我想这取决于作者决定其机制.

标签:xamarin,data-binding,mvvmcross,c
来源: https://codeday.me/bug/20191123/2065358.html