MvvmCross自定义绑定通过INotifyPropertyChanged

本文关键字:INotifyPropertyChanged 绑定 自定义 MvvmCross | 更新日期: 2023-09-27 18:19:05

我有类似的情况,但在Touch。试图通过INotifyPropertyChanged来处理这个问题。

我的代码如下:
set.Bind(txtSearch).For(x => x.Text).To(x => x.SearchText);

其中txtSearch是我的UISearchBar的自定义包装。所以,我不能继承MvxNotifyPropertyChanged,因为我已经继承从UIView(包装器是视图)。

文本属性为:

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

,我在搜索栏文本更改(工作)上启动它。

我还添加了以下内容:

    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的对象?

谢谢!

MvvmCross自定义绑定通过INotifyPropertyChanged

INotifyPropertyChanged在ViewModel端用于属性更改。

在View端,MvvmCross在Windows上使用DependencyProperty绑定,而在Xamarin平台上使用c#方法、属性和事件。

INotifyPropertyChanged默认情况下没有在视图端提供-因为没有现成的视图对象支持INotifyPropertyChanged,那么在任何MvvmCross视图平台中尝试绑定到它是没有意义的。

然而,绑定系统是可扩展的-所以如果有人想要编写基于INotifyPropertyChanged的视图,并希望在视图端包含自定义INotifyPropertyChanged绑定,那么他们可以按照类似于在MvvmCross中如何做自定义绑定属性和以下示例的步骤来做,链接自https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

如果他们想为视图端编写一个基于INotifyPropertyChanged的系统,那么我确信这可以使用自定义绑定方法来实现-但这不是我个人做过的事情。我希望这样的自定义绑定既适用于INotifyPropertyChanged,也适用于MvxNotifyPropertyChanged(因为MvxNotifyPropertyChanged实现了INotifyPropertyChanged) -但我想这将取决于作者决定的机制。