在过去的几个星期我一直在致力于开发使用MVVMCross框架的跨平台应用(iOS /安卓/ WP7)的。 今天,我遇到了一个问题,我真的不知道怎么解决,所以希望你可以把我在正确的方向。
在IOS我有以下建设导航到另一个页面(下面的代码坐落在一个视图模型):
KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");
public IMvxCommand BeckhoffActuator1
{
get
{
return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
}
}
当这个IMvxCommand被触发(按下按钮)下一个视图被加载,在这种情况下,BeckhoffActuatorViewModel。 在BeckhoffActuatorView的代码,我用的是keyvaluepair从上面:
public class BeckhoffActuatorView : MvxTouchDialogViewController<BeckhoffActuatorViewModel>
{
ICollection<string> icol;
public BeckhoffActuatorView(MvxShowViewModelRequest request) : base(request, UITableViewStyle.Grouped, null, true)
{
icol = request.ParameterValues.Values;
}
public override void ViewDidLoad()
{
//Code
}
}
这种结构在IOS工作正常,但我想用我的Android应用程序相同的结构。
在视图模型的代码并没有改变,因为这是MVVM的整体思路。 但BackhoffActuatorView的代码是Android不同:
public class BeckhoffActuatorView : MvxBindingActivityView<BeckhoffSensorViewModel>
{
public ICollection<string> icol;
public BeckhoffActuatorView()
{
Debug.WriteLine("Standard");
}
public BeckhoffActuatorView(MvxShowViewModelRequest request)
{
Debug.WriteLine("Custom");
icol = request.ParameterValues.Values;
}
protected override void OnViewModelSet()
{
SetContentView(Resource.Layout.BeckhoffActuatorView);
}
}
上面的代码不工作时,MvxBindingActivityView似乎并没有实现类似的ViewController我在IOS使用的东西。 该代码只来在标准构造函数,当我离开,一出完全不会编译/运行。
有谁知道知道我可以访问我与RequestNavigate发送keyvaluepair? 谢谢!
MVVMCross是基于非常约定 - 和它的工作原理上的ViewModels之间传递消息尽可能的想法。
如果您导航到使用视图模型:
KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");
public IMvxCommand BeckhoffActuator1
{
get
{
return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
}
}
那么你应该能够使用构造来挑选了在BeckhoffActuatorViewModel:
public class BeckhoffActuatorViewModel : MvxViewModel
{
public BeckhoffActuatorViewModel(string short)
{
ShortValue = short;
}
private string _shortValue;
public string ShortValue
{
get
{
return _shortValue;
}
set
{
_shortValue = value;
FirePropertyChanged("ShortValue");
}
}
}
和你的意见就可以访问ViewModel.ShortValue
(适用于iOS这可以base.ViewDidLoad(后进行),用于在OnCreate(后,Android)和WP7的OnNavigatedTo后)
对于这样的一个例子,看看在TwitterSearch例如:
- https://github.com/slodge/MvvmCrossTwitterSearch
这有它调用使用导航HomeViewModel:
private void DoSearch()
{
RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
}
以及接收使用构造的一个SEARCHTERM TwitterViewModel:
public TwitterViewModel(string searchTerm)
{
StartSearch(searchTerm);
}
请注意,只有string
s的允许在此消息传递在目前-但你总是可以用连载的JSON.Net自己的对象-或者你可以扩展的框架-它是开源的。
请注意,只有string
S, int
S, double
S和bool
s的允许通过目前该构造函数的参数-这是由于XAML的URL和Android的意图系列化的要求。 如果你想使用自己的自定义序列化对象与导航试验,然后请参阅http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html 。
另请注意,如果你想使用匿名对象导航( RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
),那么你就需要确保一个InternalsVisibleTo
属性设置-见https://github.com /slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Properties/AssemblyInfo.cs :
[assembly: InternalsVisibleTo("Cirrious.MvvmCross")]
而且......不是为懦弱......,这是不是“好MVVM代码” ......但如果你真的想/需要访问一个Android活动内部的MvxShowViewModelRequest数据,那么你可以从它提取传入意图-有包含请求(参见deserialisation的额外串CreateViewModelFromIntent
在https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs )