MvvmCross自定义绑定通过INotifyPropertyChanged
本文关键字:INotifyPropertyChanged 绑定 自定义 MvvmCross | 更新日期: 2023-09-27 18:19:05
我有类似的情况,但在Touch。试图通过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);
}
}
,我在搜索栏文本更改(工作)上启动它。
我还添加了以下内容:
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
绑定,而在Xamarin平台上使用c#方法、属性和事件。
INotifyPropertyChanged
默认情况下没有在视图端提供-因为没有现成的视图对象支持INotifyPropertyChanged
,那么在任何MvvmCross视图平台中尝试绑定到它是没有意义的。
然而,绑定系统是可扩展的-所以如果有人想要编写基于INotifyPropertyChanged
的视图,并希望在视图端包含自定义INotifyPropertyChanged
绑定,那么他们可以按照类似于在MvvmCross中如何做自定义绑定属性和以下示例的步骤来做,链接自https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross
如果他们想为视图端编写一个基于INotifyPropertyChanged
的系统,那么我确信这可以使用自定义绑定方法来实现-但这不是我个人做过的事情。我希望这样的自定义绑定既适用于INotifyPropertyChanged
,也适用于MvxNotifyPropertyChanged
(因为MvxNotifyPropertyChanged
实现了INotifyPropertyChanged
) -但我想这将取决于作者决定的机制。