繁体   English   中英

将变量从ViewModel传递到另一个视图(MVVMCross)

[英]Passing on variables from ViewModel to another View (MVVMCross)

在过去的几周里,我一直在使用MVVMCross框架开发跨平台应用程序(IOS / Android / WP7)。 今天我遇到了一个我真不知道如何解决的问题,所以希望你能把我推向正确的方向。

在IOS中,我有以下结构导航到另一个页面(下面的代码位于ViewModel中):

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(按下按钮)时,将加载下一个View,在本例中为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应用程序中使用相同的结构。

ViewModel中的代码没有改变,因为这是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似乎没有实现类似于我在IOS中使用的ViewController的东西。 代码只出现在标准构造函数中,当我完全离开它时,它将无法编译/运行。

有谁知道我可以访问我使用RequestNavigate发送的keyvaluepair吗? 谢谢!

MVVMCross是基于约定的 - 它的工作原理是尽可能在ViewModel之间传递消息。

如果您使用以下方法导航到ViewModel:

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,在OnNavigatedTo之后用于WP7)

有关此示例,请查看TwitterSearch示例:

这有一个HomeViewModel,使用以下方法调用导航:

    private void DoSearch()
    {
        RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
    }

以及使用构造函数接收searchTerm的TwitterViewModel:

    public TwitterViewModel(string searchTerm)
    {
        StartSearch(searchTerm);
    }

请注意,目前此消息中只允许使用 string - 但您始终可以使用JSON.Net序列化自己的对象 - 或者您可以扩展框架 - 它是开源的。

请注意,目前传递的构造函数参数中只允许使用string s, int s, double s和bool - 这是由于Xaml Urls和Android Intents的序列化要求。 如果您想尝试使用自己的自定义序列化对象进行导航,请参阅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数据,那么你可以从中提取它传入的Intent - 包含请求的Extras字符串(请参阅https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs中的CreateViewModelFromIntent中的反序列化)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM