传递从视图模型变量到另一个视图(MVVMCross)(Passing on variables fr

2019-06-23 16:41发布

在过去的几个星期我一直在致力于开发使用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? 谢谢!

Answer 1:

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 )



文章来源: Passing on variables from ViewModel to another View (MVVMCross)