通过INotifyPropertyChanged进行MvvmCross自定义绑定

时间:2013-06-19 11:58:23

标签: c# data-binding xamarin mvvmcross

我和this的情况类似,但是处于触摸状态。试图通过INotifyPropertyChanged处理它。

我的代码如下:

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

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

Text属性为:

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

谢谢!

1 个答案:

答案 0 :(得分:3)

在ViewModel端使用

INotifyPropertyChanged进行属性更改。

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

在View端默认情况下不提供

INotifyPropertyChanged - 因为没有现成的View对象支持INotifyPropertyChanged,所以尝试在任何一个中绑定它都没有意义。 MvvmCross查看平台。

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

相关联的示例

如果他们想为View端编写一个基于INotifyPropertyChanged的系统,那么我确信这可以通过自定义绑定方法实现 - 但这不是我个人所做的。我希望这样的自定义绑定同时适用于INotifyPropertyChangedMvxNotifyPropertyChanged(因为MvxNotifyPropertyChanged实现了INotifyPropertyChanged) - 但我想这取决于作者决定其机制。