我遇到的情况与this类似,但在Touch中.尝试通过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端用于属性更改.
在视图方面,MvvmCross在Windows上使用DependencyProperty绑定,在Xamarin平台上使用C#方法,属性和事件.
View端默认不提供INotifyPropertyChanged-由于没有现成的View对象支持INotifyPropertyChanged,因此在任何MvvmCross View平台中尝试将其绑定都是没有意义的.
但是,绑定系统是可扩展的-因此,如果有人想编写基于INotifyPropertyChanged的视图,并希望为View端添加自定义INotifyPropertyChanged绑定,那么他们可以按照类似于In MvvmCross how do I do custom bind properties的步骤以及以下从https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross链接的示例进行操作
如果他们想为View端编写一个基于INotifyPropertyChanged的系统,那么我敢肯定,可以使用自定义绑定方法来实现-但这不是我个人所做的.我希望这样的自定义绑定对INotifyPropertyChanged和MvxNotifyPropertyChanged也都有效(因为MvxNotifyPropertyChanged实现了INotifyPropertyChanged)-但我想这取决于作者决定其机制.