4

これに似た状況がありますが、タッチしています。ただし、INotifyPropertyChanged を介してそれに対処しようとしています。

私のコードは次のとおりです。

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

ここで、txtSearch は UISearchBar のカスタム ラッパーです。そのため、既にUIView (ラッパーはビュー)から継承しているため、 MvxNotifyPropertyChangedから継承することはできません。

テキスト プロパティは次のとおりです。

 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 側で使用されます。

ビュー側では、MvvmCross はDependencyPropertyWindows でバインディングを使用し、Xamarin プラットフォームで C# メソッド、プロパティ、およびイベントを使用します。

INotifyPropertyChangedView 側ではデフォルトで提供されていません。市販の View オブジェクトは をサポートINotifyPropertyChangedしていないため、MvvmCross View プラットフォーム内でバインドしようとしても意味がありませんでした。

ただし、バインディング システムは拡張可能です。そのため、誰かがINotifyPropertyChangedベース ビューを作成INotifyPropertyChangedし、ビュー側にカスタム バインディングを含めたい場合は、「MvvmCross でカスタム バインド プロパティを実行するにはどうすればよいですか」と同様の手順に従ってそれを行うことができますhttps://speakerdeck.com/cirrious/custom-bindings-in-mvvmcrossからリンク

彼らが View 側の に基づいたシステムを作成したい場合はINotifyPropertyChanged、カスタム バインディング アプローチを使用してこれを実現できると確信していますが、それは私が個人的に行ったことではありません。私はそのようなカスタムバインディングが両方のために機能することを期待しINotifyPropertyChangedていMvxNotifyPropertyChangedます(MvxNotifyPropertyChanged実装しているためINotifyPropertyChanged)-しかし、そのメカニズムを決定するのは作者次第だと思います。

于 2013-06-19T12:57:41.667 に答える