c# - MvvmCross 自定义绑定(bind)通过 INotifyPropertyChanged

标签 c# data-binding xamarin mvvmcross

我遇到了与 this 类似的情况, 但在触摸中。尝试通过 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 端用于属性更改。

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

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

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

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

关于c# - MvvmCross 自定义绑定(bind)通过 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17190609/

相关文章:

c# - 滚动没有发生

C# Mongodb 驱动程序 - 带有方法调用的表达式不起作用

c# - HRESULT 异常 : 0x80070057 (E_INVALIDARG)

asp.net - 我是否对 GridView 使用 RowDataBound 或 DataBound

c# - Xamarin Android 启动时崩溃 "Got a SIGSEGV"

c# - 异步/等待 Android 下的不良做法?

c# - 创建针对 .Net Framework 4.5 和 .Net Standard 的库

c# - SQLite Interop DLL 缺少方法 - Windows Mobile CF

在没有 InvokeRequired 的多线程场景中,Winforms 数据绑定(bind)到业务对象?

javascript - 如果使用 setTimeout,AngularJS 会出现奇怪的数据绑定(bind)行为