我和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的对象?
谢谢!
答案 0 :(得分:3)
INotifyPropertyChanged
进行属性更改。
在View端,MvvmCross在Windows上使用DependencyProperty
绑定,在Xamarin平台上使用C#方法,属性和事件。
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
的系统,那么我确信这可以通过自定义绑定方法实现 - 但这不是我个人所做的。我希望这样的自定义绑定同时适用于INotifyPropertyChanged
和MvxNotifyPropertyChanged
(因为MvxNotifyPropertyChanged
实现了INotifyPropertyChanged
) - 但我想这取决于作者决定其机制。