4

我有类似的情况但在联系中。尝试通过 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);
    }
}

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

谢谢!

4

1 回答 1

3

INotifyPropertyChanged在 ViewModel 端用于属性更改。

在视图方面,MvvmCrossDependencyProperty在 Windows 上使用绑定,在 Xamarin 平台上使用 C# 方法、属性和事件。

INotifyPropertyChangedView 端默认不提供 - 因为没有现成的 View 对象支持INotifyPropertyChanged,所以在任何 MvvmCross View 平台中尝试绑定它是没有意义的。

但是,绑定系统是可扩展的 - 因此,如果有人想要编写INotifyPropertyChanged基于视图并想要包含INotifyPropertyChanged视图端的自定义绑定,那么他们可以按照类似于In MvvmCross 如何执行自定义绑定属性和以下示例的步骤来执行此操作从https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross链接

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

于 2013-06-19T12:57:41.667 回答